0

次のようなコードがあります。

class A {
public string Name {get;set;}
public IList<string> Keywords {get;set;}
}

...

IList<A> a = new List<A>{
        new A{Name = "a1", Keywords = new List<string>{"k1", "k2"}},
        new A{Name = "a2", Keywords = new List<string>{"k1", "k3"}},
        new A{Name = "a3", Keywords = new List<string>{"k3", "k4"}},
        new A{Name = "a4", Keywords = new List<string>{"k1", "k3", "k4"}}
    };

LINQ を使用して次の形式で辞書を作成する方法はありますか。

{"k1", List<A> {a1, a2, a4}} 
{"k2", List<A> {a1}}
{"k3", List<A> {a2, a3, a4}}
{"k4", List<A> {a3, a4}}

基本的に、オブジェクトをキーワードにマッピングします。

ありがとう

4

2 に答える 2

1

何かのようなもの

var dict = a
    .SelectMany(myA =>
        myA.Keywords.Select(kw => new { Name = myA.Name, Keyword = kw }))
    .GroupBy(pair => pair.Keyword)
    .ToDictionary(g => g.Key, g => g.Select(pair => pair.Name).ToList());

するべきです。

于 2013-01-04T12:28:31.130 に答える
1

それはそれを行う必要があります:

var keywordsAndNames = a.SelectMany(anA => anA.Keywords.Select(kw => 
                           new { KeyWord = kw, Name = anA.Name }));
var lookup = keywordsAndNames.ToLookup(entry => entry.KeyWord, entry => entry.Name);

各キーには複数の名前があるため、このコードは辞書ではなくルックアップを作成することに注意してください。

lookup["k1"]IEnumerable<string>たとえば、生成される "a1"、"a2"、および "a4" を返します。

于 2013-01-04T12:27:41.637 に答える