【问题标题】:Extracting unique keys from key/value pairs, and grouping the values in an array从键/值对中提取唯一键,并将值分组到数组中
【发布时间】:2009-07-15 13:10:36
【问题描述】:

假设我有一个List<NameValuePair>,其中 NameValuePair 是一个简单的对象,它有一个 Name 属性和一个 Value 属性,这两个都是字符串。

列表中的值如下所示:

name = "name1", value = "value1"
name = "name1", value = "value2"
name = "name2", value = "value3"
name = "name3", value = "value4"

请注意,“name1”键有两个实例。可以有任意数量的键(因为这是一个列表)。

我想把这个 List 变成一个新的列表,它只有唯一的键,并将具有相同键名的任何值分组为该键的数组/列表。

所以上面应该变成:

name = "name1", value = "value1", "value2" // value is a string array or list
name = "name2", value = "value3"
name = "name3", value = "value4"

最简单的方法是什么?

【问题讨论】:

    标签: c# arrays


    【解决方案1】:

    最简单的方法是使用ILookup,它本质上类似于字典,但每个键可以有多个值。

    您可以执行以下操作来创建查找:

    var lookup = list.ToLookup(pair => pair.name, 
                               pair => pair.value);
    

    然后您可以像这样打印名称/值对:

    foreach (var nameGroup in lookup)
    {
        var name = nameGroup.Key;
        foreach (string value in nameGroup)
            Console.WriteLine("Name: {0}, Value: {1}", name, value);
    }
    

    【讨论】:

      【解决方案2】:

      也许使用 Dictionary> 你可以做类似的事情

      for (var kv in mylistofnamed) {
         if (!dict.ContainsKey(kv.Key))
            dict[kv.Key] = new List<string>();
         dict[kv.Key].Add(kv.Value);
      }
      
      ?

      【讨论】:

      • 效果很好。仅供参考,为了处理字典之后,我不得不使用 foreach KeyValuePair: foreach (KeyValuePair> kvp in dict) { Console.WriteLine("key " + dict.Key); Console.WriteLine("值" + dict.Value); }
      【解决方案3】:

      如果您只需要一个只读集合,那么Lookup 就可以解决问题,就像Meta-Knight's answer 一样。

      如果您需要在初始创建/填充集合后对其进行修改,那么您可能需要Dictionary&lt;string, List&lt;string&gt;&gt; 之类的东西。您可以使用 LINQ 从原始列表中创建和填充这样的字典:

      var dict = list
          .GroupBy(x => x.Name)
          .ToDictionary(x => x.Key, y => y.Select(z => z.Value).ToList()); 
      

      【讨论】:

        【解决方案4】:

        一种方法是使用字典:

        http://arcanecode.com/2007/03/05/dictionaries-in-c-the-hashtable/

        HashTable 可以使用唯一键完成您需要的操作。但是,您必须提供一个 List 作为值,因为您将为每个键存储多个值。

        这是另一个简单的例子:

        http://dotnetperls.com/hashtable-keys

        您需要遍历列表中的每个 KeyValuePair 以通过将名称存储为键并将值存储为值来填充 HashTable。因为您可能有一个指向多个值的名称,所以您需要将 HashTable 中的值设为列表。

        检查哈希表中是否存在名称,如果不存在,则为该名称创建一个新列表并将值添加到列表中。如果键已存在,则访问 HashTable 中的该元素并将新值添加到映射到该键的列表中。

        【讨论】:

          【解决方案5】:

          所有实现IDictionary 接口或通用IDictionary 接口的类都会对键进行唯一性检查。您可以使用任何类,但我承认我更喜欢 Generic Dictionary&lt;TKey, TValue&gt; 类。

          添加值时,您只需检查 Dictionary 对象是否已包含提供的 Key。如果没有,那么您可以将该项目添加到字典中。

          【讨论】:

            猜你喜欢
            • 2021-01-25
            • 2019-05-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-18
            相关资源
            最近更新 更多