2011-06-30 12 views
2

が、私はそうのように、人の名前を持っているそれぞれのオブジェクトのフラットなリストと、彼らがしている、単一の役割を考えてみましょう:今すぐこれを行うには、より良いLINQクエリがありますか?

 var People = new[] { 
      new PersonRole(){ Name = "Adam", Role = "R1" }, 
      new PersonRole(){ Name = "Adam", Role = "R2" }, 
      new PersonRole(){ Name = "Adam", Role = "R3" }, 
      new PersonRole(){ Name = "Bob", Role = "R1" }, 
     }; 

、にこれを取得するための直接的な方法があります名前と役割に基づくDictionary<string, List<string>>(明らかに)。私は以下のように2つのステップでそれを行いましたが、より直接的な方法があると考える必要があります。

Dictionary<string, List<string>> resultLookup = 
    People.Select(p => p.Name).Distinct().ToDictionary(str => str, str => new List<string>()); 

People.ForEach(p => resultLookup[p.Name].Add(p.Role)); 

ありがとうございます!

+0

あなたは人が複数の役割を持つことができるので、辞書<文字列、リスト>を使用することを選択していますか?私はちょうどDictionary が良いと思います。そのどちらか、またはRoleプロパティをRole(s)配列にします。 –

+0

はい、人は複数の役割を持つことができます –

答えて

2
var dict = People.ToLookup(p=>p.Name, p=>p.Role) 
    .ToDictionary(it=>it.Key, it=>it.ToList()); 
+0

これは最適なソリューションです! –

+0

ああ、私はちょうど私がGroupByを忘れたと思った。 –

5
Dictionary<string, List<string>> dictionary = people.GroupBy(p => p.Name).ToDictionary(g => g.Key, g => g.Select(p => p.Role).ToList()); 

テストされていないが、私はそれが動作するはずだと思う...

EDIT今それをテストし、それが実際の作業で行います。

+0

GroupBy - それは私が考えることができなかったものです - どのように恥ずかしいですが、ありがとうございます。 –

+1

@Adam:ようこそ。なぜあなたはそれが恥ずかしいと思うか分かりません。それはあなたが確信している質問をするために、SOのためです。 – BFree

3

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

var people = new[] { 
    new { Name = "Adam", Role = "R1" }, 
    new { Name = "Adam", Role = "R2" }, 
    new { Name = "Adam", Role = "R3" }, 
    new { Name = "Bob", Role = "R1" }, 
}; 

var r = from p in people 
     group p by p.Name 
     into g 
     select new { 
      Name = g.Key, 
      Roles = g.Select(p => p.Role).ToList() 
     }; 

var d = r.ToDictionary(k => k.Name, e => e.Roles); 
+0

あなたは 'ToList'呼び出しを忘れました。指定されたOPはロールを含む' List 'を望んでいました。 – CodesInChaos

+0

真、真正です。 –

+0

+1は '.ToDictionary'を使用するために括弧で囲まれたクエリスタイルのlinqをラップしません。これらの部分を別の行/割り当てに分割するだけで、はっきりとわかります。 – Shibumi

1
var result = People.GroupBy(a => a.Name).ToDictionary(a => a.First().Name, b => b.Select(c => c.Role).ToList()); 
1
People 
.GroupBy(p => p.Name) 
.ToDictionary(p => p.Key, p => p.Select(pr => pr.Role).ToList()) 
関連する問題