2012-05-03 72 views
2

我有一個字符串列表的列表構建一個解釋看起來是這樣的:使用LINQ to從分隔字符串

abc|key1|486997 
def|key1|488979 
ghi|key2|998788 
gkl|key2|998778 
olz|key1|045669 

如何使用LINQ和ToDictionary產生Dictionary<string, List<string>>看起來像

key1 : { abc|key1|486997, def|key1|488979, olz|key1|045669 } 
key2 : { ghi|key2|998788, gkl|key2|998778 } 

基本上我希望能夠提取第二個元素作爲關鍵用途ToDictionary()在一個全面創建字典。

目前,我正在做這個..

var d = new Dictionary<string, List<string>>(); 

      foreach(var l in values) 
      { 
       var b = l.Split('|'); 
       var k = b.ElementAtOrDefault(1); 

       if (!d.ContainsKey(k)) 
        d.Add(k, new List<string>()); 

       d[k].Add(l); 
      } 

我已經看到了從分隔值的單串建設字典的問題,但我 知道是否有一個優雅的方式來做到這一點當從一個分隔字符串列表開始時。

+0

可能重複:http://stackoverflow.com/questions/10400213/using-linq-to-read-key-value-pa ir-from-configuration-file – SupremeDud

回答

4
var list = new [] 
{ 
"abc|key1|486997", 
"def|key1|488979", 
"ghi|key2|998788", 
"gkl|key2|998778", 
"olz|key1|045669" 
}; 

var dict = list.GroupBy(x => x.Split('|')[1]) 
       .ToDictionary(x => x.Key, x => x.ToList()); 

你也可以把它轉換爲查找(這是非常與之相似的Dictionary<K,IEnumerable<V>>)一個炮打響:

var lookup = list.ToLookup(x => x.Split('|')[1]); 
+0

謝謝!這是我最終弄清楚的。 – duckus

1

如果你的數據是保證這樣的一致,你可以做這樣的事情:

var data = new[] 
       { 
        "abc|key1|486997", 
        "def|key1|488979", 
        "ghi|key2|998788", 
        "gkl|key2|998778", 
        "olz|key1|045669" 
       }; 
var items = data 
      .GroupBy(k => k.Split('|')[1]) 
      .ToDictionary(k => k.Key, v => v.ToList()); 
1
var data = new[] 
       { 
        "abc|key1|486997", 
        "def|key1|488979", 
        "ghi|key2|998788", 
        "gkl|key2|998778", 
        "olz|key1|045669" 
       }; 
var dictionary = data.Select(row => row.Split('|')) 
    .GroupBy(row => row[1]) 
    .ToDictionary(group => group.Key, group => group); 
+0

這將返回一個'Dictionary >' – vcsjones

+0

@vcsjones是的,是的。 OP沒有指定所需的類型,所以我們不知道他將如何使用它。 – Servy

+1

引用OP:*如何使用LINQ和ToDictionary生成** Dictionary > *** – vcsjones

相關問題