2

次のような文字列のリストがあります。

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

Dictionary<string, List<string>>LINQ と ToDictionary を使用して、次のようなものを生成するにはどうすればよいですか

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

基本的には、ToDictionary() を使用して 2 番目の要素をキーとして抽出し、1 回で辞書を作成できるようにしたいと考えています。

私は現在これをやっています..

 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);
            }

区切られた値の単一の文字列から辞書を作成することに関する質問を見てきましたが、代わりに区切られた文字列のリストから始めるときにこれを行うエレガントな方法があるかどうか疑問に思っています。

4

3 に答える 3

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>>ワンショットでルックアップに変換することもできます (これは a に非常に似ています):

var lookup = list.ToLookup(x => x.Split('|')[1]);
于 2012-05-03T18:03:23.310 に答える
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());
于 2012-05-03T17:56:54.653 に答える
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);
于 2012-05-03T18:02:01.437 に答える