2009-07-15 94 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());