更改字典C#的值

时间:2016-08-24 18:12:40

标签: c# dictionary boolean

我创建了一个字典(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

2 个答案:

答案 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;
}

当然,在这种情况下,原始字典的值是没用的,所以不需要传入它,所以我把它从这个版本的方法的参数列表中删除了。

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