2009-07-15 52 views
2

分组值比方说,我有一个List<NameValuePair>,其中的NameValuePair是一个简单的对象具有Name属性和Value属性,两个字符串。从提取键/值对的唯一密钥,并在阵列

该列表中填充值是这样的:

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

注意这里是“名1”键的两个实例。可以有任意数量的键(因为这是一个List)。

我希望把这个列表成为一个新列表,它具有独特的只是按键和组使用相同的密钥名称作为关键的数组/列表中的任意值。

所以上面应该成为:

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

什么是完成这一任务的最简单的方法?

回答

1

也许有字典<字符串,列表<字符串> >你可以做类似

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

+0

这很好用。只是为了信息,以处理后的字典,我不得不使用的foreach KeyValuePair: 的foreach(KeyValuePair <字符串,列表> KVP在字典) { Console.WriteLine( “键” + dict.Key); Console.WriteLine(“Value”+ dict.Value); } – ObiWanKenobi 2009-07-15 13:42:05

0

一种方法是用一本字典:

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

一个Hashtable可以做你需要的唯一密钥是什么。但是,您必须提供一个List作为值,因为您将为每个键存储多个值。

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

http://dotnetperls.com/hashtable-keys

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

检查名称HashTable中存在,如果它不存在,创建该名称的新列表和值添加到列表中。如果密钥已经存在,则访问HashTable中的该元素并将新值添加到映射到该密钥的列表中。

7

最简单的方法是用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); 
} 
0

实现该IDictionary接口或通用IDictionary的接口执行用于键唯一性检查的所有类。你可以使用任何类的,虽然我承认我对通用Dictionary<TKey, TValue>类偏好。

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

1

如果你只需要一个只读集合,然后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());