更改字典C的值#
我创建了一本字典(Dictionary<string, bool> values
)。更改字典C的值#
我创建函数:
private Dictionary<string, bool> ChangeValues(int line, Dictionary<string, bool> values)
{
for (int i = 0; i < line; i++)
{
}
return values;
}
我想根据线的数量来改变布尔值。
下表是一个辞典的结果(只显示布尔):
line 0 = values["A"][false]
values["B"][false]
values["C"][false]
line 1 = values["A"][false]
values["B"][false]
values["C"][true]
line 2 = values["A"][false]
values["B"][true]
values["C"][false]
line n...
如何变更,根据线的数量bool值?
感谢。
[更新]
一些帮助后,函数完成:
private Dictionary<string, bool> ChangeValues(int line, Dictionary<string, bool> values)
{
string[] keys = values.Keys.ToArray();
keys = (from k in keys orderby k descending select k).ToArray();
for (int i = 0; i < line; i++)
{
for (int j = 0, bit = 1; j < values.Count; j++, bit <<= 1)
{
values[keys[j]] = (i & bit) != 0;
}
}
return values;
}
由于PeterDuniho
如果我正确地理解了这个问题,所有你想要的是能够迭代存储在你的字典中的所有可能的组合标志。另外,这些标志与您的循环变量i
中的位完全对应。
如果是这样,那么您可以直接使用循环变量中的位来设置字典中的标志值。对于一个通用的解决方案,您还需要传递密钥名称,并根据要设置的位以正确的顺序传递密钥名称。
例如:
private Dictionary<string, bool> ChangeValues(int line, Dictionary<string, bool> values, string[] keys)
{
for (int i = 0; i < line; i++)
{
for (int j = 0, bit = 1; j < keys.Length; j++, bit <<= 1)
{
values[keys[j]] = (i & bit) != 0;
}
// do something with values here
}
return values;
}
呼叫这样的:
var result = ChangeValues(8, values, new [] { "C", "B", "A" });
注意上面的简单的修改中传递我从有人问—的方式推断字典“我想更改布尔值“ —这是你的意图。但是,如果你真的想回到一个全新的字典对象,你可以这样做:
private Dictionary<string, bool> ChangeValues(int line, string[] keys)
{
Dictionary<string, bool> values = new Dictionary<string, bool>();
for (int i = 0; i < line; i++)
{
for (int j = 0, bit = 1; j < keys.Length; j++, bit <<= 1)
{
values[keys[j]] = (i & bit) != 0;
}
// do something with values here
}
return values;
}
当然,在这种情况下,原来的字典的值都是没有用的,所以没有必要将它传递in,所以我把它从这个版本的方法的参数列表中删除了。
如果实际上你想返回一个新的字典,但由于某种原因仍然需要旧字典(例如,你想对它做些什么,比如复制值或其他你没有提到的问题),那么你可以结合上面的两个例子来满足你的需求。
很难知道提问者想要什么,但在我看来,你的代码一遍又一遍地覆盖'Dictionary '中的相同条目?我错了吗? –
@杰普:你是对的;这就是我解释这个问题的方式,它的内容是_“我想改变布尔值”_,而不是_“我想设置布尔值”_。如果OP愿意的话,在方法中创建一个新的字典会很容易;但是我不可能知道他们是否想要这样做,或者只是将该方法编写成一种“伪流利”语法(即返回传入的字典)。 –
因此,当您的调用示例为'ChangeValues(8,values,new [] {“C”,“B”,“A”})',当外循环变量'i'为'0'时,'Dictionary .Values'是FFF(三个'false'),那么当'i'已经是'1'时,所有这些都被覆盖,并且我们没有FFT。最后,它就像我们只有外循环变量'i'的___last___迭代一样。所以我们总是以二进制形式对应'line - 1'。 –
你的意思是这样的:
static Dictionary<string, bool> ChangeValues(int line, Dictionary<string, bool> values)
{
switch (line)
{
case 0:
values["A"] = false;
values["B"] = false;
values["C"] = false;
break;
case 1:
values["A"] = false;
values["B"] = false;
values["C"] = true;
break;
case 2:
values["A"] = false;
values["B"] = true;
values["C"] = false;
break;
}
return values;
}
注:您也可以有void
r eturn类型(如static void ChangeValues
)并省略return values;
语句,因为总是返回相同的实例,但这取决于您是否需要“流畅语法”。
后评论,试试这个:
static Dictionary<string, bool> ChangeValues(int line, Dictionary<string, bool> values)
{
var binary = Convert.ToString(line, 2);
var key = 'A';
foreach (var c in binary)
{
values[key.ToString()] = c == '1';
key++;
}
return values;
}
注释有关void
是和以前一样。
这个想法是正确的,但如果字典有5个输入(A,B,C,D和E)?输入是变量。 – jsfelipearaujo
@jsfelipearaujo你想要一个二进制表示? –
我认为是的,但我如何用变量字典做到这一点? – jsfelipearaujo
您能否提供样本输入和期望的输出?目前的产量是多少? –
@FirstStep如果行是0,所有的布尔值将是false,如果行是1,则最后一行将是true,如果行是2,则最后一行将是true ...也许等于二进制逻辑?我不知道... – jsfelipearaujo
你是什么意思“_line是0_”?你的意思是'=“0”'或什么? –