更改字典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

+1

您能否提供样本输入和期望的输出?目前的产量是多少? –

+0

@FirstStep如果行是0,所有的布尔值将是false,如果行是1,则最后一行将是true,如果行是2,则最后一行将是true ...也许等于二进制逻辑?我不知道... – jsfelipearaujo

+0

你是什么意思“_line是0_”?你的意思是'=“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" }); 

注意上面的简单的修改中传递我从有人问—的方式推断字典“我想更改布尔值“ —这是你的意图。但是,如果你真的想回到一个全新的字典对象,你可以这样做:

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,所以我把它从这个版本的方法的参数列表中删除了。

如果实际上你想返回一个新的字典,但由于某种原因仍然需要旧字典(例如,你想对它做些什么,比如复制值或其他你没有提到的问题),那么你可以结合上面的两个例子来满足你的需求。

+0

很难知道提问者想要什么,但在我看来,你的代码一遍又一遍地覆盖'Dictionary '中的相同条目?我错了吗? –

+0

@杰普:你是对的;这就是我解释这个问题的方式,它的内容是_“我想改变布尔值”_,而不是_“我想设置布尔值”_。如果OP愿意的话,在方法中创建一个新的字典会很容易;但是我不可能知道他们是否想要这样做,或者只是将该方法编写成一种“伪流利”语法(即返回传入的字典)。 –

+0

因此,当您的调用示例为'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是和以前一样。

+0

这个想法是正确的,但如果字典有5个输入(A,B,C,D和E)?输入是变量。 – jsfelipearaujo

+0

@jsfelipearaujo你想要一个二进制表示? –

+0

我认为是的,但我如何用变量字典做到这一点? – jsfelipearaujo