2012-07-20 213 views
58

這似乎是一件很奇怪的事情,但是忽略了這一點,是否有一個簡潔的方式將List轉換爲字典,其中Dictionary中的每個鍵值對都只是列表中的每個字符串。即C#將列表<string>轉換爲字典<string,string>

List = string1, string2, string3 
Dictionary = string1/string1, string2/string2, string3/string3 

我已經做了很多搜索的和你確實有很多的例子#2單獨向相反的方向做,但不這樣一輪。

這樣做的原因是我有兩個第三部分組件,並且改變它們不在我的手中。一個將列表中的電子郵件地址作爲List返回,另一個發送To參數爲Dictionary的電子郵件。字典的關鍵是電子郵件地址,價值是他們的真實姓名。但是,我不知道真名,但如果您將真實姓名也設置爲電子郵件地址,它仍然有效。因此,我爲什麼要將List轉換爲字典。有很多方法可以做到這一點。列表中的foreach循環將kvp添加到字典中。但我喜歡簡潔的代碼,並想知道是否有單線解決方案。

+1

我有一個更好的解決方案,爲您的正當理由,誠實。 – Will 2012-07-20 14:15:38

+2

您可能想查看HashSet <>是否符合您的要求,而不是使用字典<,>。 – Greg 2012-07-20 14:15:50

+0

比上面的評論者更直接:如果你解釋你想要這個的原因,有人可能會提出更好的解決方案。 – 2012-07-20 14:25:55

回答

124

試試這個:

var res = list.ToDictionary(x => x, x => x); 

第一拉姆達讓您挑選的關鍵,第二個採值。

你可以用它玩,使值從按鍵不同,像這樣:

var res = list.ToDictionary(x => x, x => string.Format("Val: {0}", x)); 

如果您的列表包含重複,加上Distinct()這樣的:

var res = list.Distinct().ToDictionary(x => x, x => x); 

編輯要發表評論根據正當的理由,我認爲這樣的轉換可能有效的唯一原因是,在某些時候,結果字典中的鍵和值會發生分歧。例如,您將執行初始轉換,然後用其他值替換一些值。如果鍵和值總是將是相同的,HashSet<String>將爲您的情況更加適合:

var res = new HashSet<string>(list); 
if (res.Contains("string1")) ... 
+0

如果列表類似於string1,string2,string3,string1 – 2012-07-20 14:16:33

+3

@PranayRana Yes , 它會。你可以在'list'後添加'.Distinct()'來避免這種情況。 – dasblinkenlight 2012-07-20 14:19:12

+0

謝謝。我錯過了ToDictionary功能。感謝大家基本上給出了相同的答案。我向每個人投了票,但只能接受一個答案。這是唯一一個添加了不同的代碼,所以在我看來是最完整的。 – Jonnster 2012-07-20 15:29:04

7

使用此:

var dict = list.ToDictionary(x => x); 

更多信息,請參見MSDN

隨着Pranay在評論中指出,如果一個項目多次出現在列表中,這將失敗。
根據您的具體要求,您可以使用var dict = list.Distinct().ToDictionary(x => x);獲得不同項目的字典,也可以使用ToLookup代替:

var dict = list.ToLookup(x => x); 

這將返回一個ILookup<string, string>這是基本相同IDictionary<string, IEnumerable<string>>,所以你會有一個不同的密鑰列表,每個字符串實例都在其下。

+0

如果列表類似於string1,string2,string3,string1 – 2012-07-20 14:16:38

+0

@PranayRana,那麼這將失敗:你是對的。修復。 – 2012-07-20 15:43:15

1

通過使用ToDictionary

var dictionary = list.ToDictionary(s => s); 

如果它是可能的任何字符串可以重複,或者做一個Distinct呼叫第一列表上(刪除重複),或者使用ToLookup其允許每多個值鍵。

0

編輯

另一種方式來處理重複的,你可以像這樣

var dic = slist.Select((element, index)=> new{element,index}) 
      .ToDictionary(ele=>ele.index.ToString(), ele=>ele.element); 


簡單的辦法就是

var res = list.ToDictionary(str => str, str=> str); 

但要確保沒有串重複......再次otherewise上面的代碼不會爲你

工作,如果有串的重複比它更好地做到這樣

Dictionary<string,string> dic= new Dictionary<string,string>(); 

    foreach(string s in Stringlist) 
    { 
     if(!dic.ContainsKey(s)) 
     { 
     // dic.Add(value to dictionary 
     } 
    } 
-1

您可以使用:

var dictionary = myList.ToDictionary(x => x); 
相關問題