![](/img/trans.png)
[英]C# Convert List<string> to Dictionary<string, string> LINQ
[英]C# Convert List<string> to Dictionary<string, string>
這似乎是一件奇怪的事情,但忽略了這一點,是否有一種簡潔的方法可以將List<string>
轉換為Dictionary<string, string>
,其中 Dictionary 中的每個鍵值對只是 List 中的每個字符串。 IE
List = string1, string2, string3
Dictionary = string1/string1, string2/string2, string3/string3
我做了很多搜索,僅在 Stackoverflow 上就有幾十個相反方向的例子,但不是這樣。
這樣做的原因是我有兩個第三方組件,我無法更改它們。 一個以List<string>
的形式返回電子郵件地址列表,另一個發送電子郵件,其中 To 參數是Dictionary<string, string>
。 字典的鍵是電子郵件地址,值是他們的真實姓名。 但是,我不知道真實姓名,但如果您也將真實姓名設置為電子郵件地址,它仍然有效。 因此,為什么我想將 List 轉換為Dictionary<string, string>
。 有很多方法可以做到這一點。 列表上的foreach
循環將 kvp 添加到字典。 但我喜歡簡潔的代碼,想知道是否有單行解決方案。
試試這個:
var res = list.ToDictionary(x => x, x => x);
第一個 lambda 讓你選擇鍵,第二個讓你選擇值。
您可以使用它並使值與鍵不同,如下所示:
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")) ...
用這個:
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>>
基本相同,因此您將擁有一個不同鍵的列表,每個字符串實例都在它下面。
編輯
另一種處理重復的方法是你可以這樣做
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);
但要確保沒有重復的字符串……否則上面的代碼對你不起作用
如果有字符串重復比這樣做更好
Dictionary<string,string> dic= new Dictionary<string,string> ();
foreach(string s in Stringlist)
{
if(!dic.ContainsKey(s))
{
// dic.Add( value to dictionary
}
}
通過使用ToDictionary
:
var dictionary = list.ToDictionary(s => s);
如果有可能重復任何字符串,請首先在列表上執行Distinct
調用(以刪除重復項),或者使用允許每個鍵有多個值的ToLookup
。
您可以使用:
var dictionary = myList.ToDictionary(x => x);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.