我创建了一个字典(Dictionary<string, bool> values
)。
我创建了这个函数:
private Dictionary<string, bool> ChangeValues(int line, Dictionary<string, bool> values)
{
for (int i = 0; i < line; i++)
{
}
return values;
}
我想根据行数更改bool值。
下表是字典的结果(仅显示bool):
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
答案 0 :(得分:0)
你的意思是这样的:
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
返回类型(如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
的评论与以前相同。
答案 1 :(得分:0)
如果我正确理解了这个问题,那么你想要的就是能够迭代存储在字典中的所有可能的标志组合。此外,这些标志与循环变量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" });
请注意,上面只是修改了传入的字典。我从问题的方式推断 - “我想改变bool值” - 这是你的意图。但是,如果您确实想要返回一个全新的字典对象,则可以这样做:
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;
}
当然,在这种情况下,原始字典的值是没用的,所以不需要传入它,所以我把它从这个版本的方法的参数列表中删除了。
如果实际上你想要返回一个新词典,但由于某种原因仍然需要旧词典(例如你想用它做一些事情,比如复制你在问题中没有提到的值或其他东西),那么你可以结合上面的两个例子来满足你的需求。