代码之家  ›  专栏  ›  技术社区  ›  ObiWanKenobi

从键/值对中提取唯一键,并将值分组到数组中

  •  2
  • ObiWanKenobi  · 技术社区  · 17 年前

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

    列表中填充的值如下所示:

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

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

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

    因此,上述内容应成为:

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

    最简单的方法是什么?

    5 回复  |  直到 17 年前
        1
  •  7
  •   Meta-Knight    17 年前

    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
  •  1
  •   Amos Robinson    17 年前

    可能需要一本字典<字符串,列表<字符串>&燃气轮机;你可以这样做

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

        3
  •  1
  •   Community Mohan Dere    9 年前

    如果您只需要一个只读集合,那么 Lookup 会成功的,就像 Meta-Knight's answer .

    如果您需要在集合的初始创建/填充之后修改集合,那么您可能需要 Dictionary<string, List<string>> . 您可以使用LINQ从原始列表创建和填充这样的字典:

    var dict = list
        .GroupBy(x => x.Name)
        .ToDictionary(x => x.Key, y => y.Select(z => z.Value).ToList()); 
    
        4
  •  0
  •   AlbertoPL    17 年前

    一种方法是使用字典:

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

    哈希表可以使用唯一的键执行您需要的操作。但是,您必须提供一个列表作为值,因为每个键将存储多个值。

    下面是另一个简单的例子:

    http://dotnetperls.com/hashtable-keys

    您需要迭代列表中的每个KeyValuePair,通过将名称存储为键,将值存储为值来填充哈希表。因为您可能有一个指向多个值的名称,所以需要将哈希表中的值作为列表。

        5
  •  0
  •   Cerebrus    17 年前

    实现 IDictionary 接口或通用IDictionary接口强制执行密钥的唯一性检查。您可以使用任何类,尽管我承认我更喜欢泛型 Dictionary<TKey, TValue> 班