2009-02-26 31 views
3

から個別値を選択します。C#が、私は2つのクラスを持っているIGrouping

var someGroup = from f in fooList 
       orderby f.SomeBar.Name ascending 
       group f by f.SomeBar.Name into Group 
       select Group; 

がどのように私は明確なバーのリストからを取得することができます。

class Foo 
{ 
    public Bar SomeBar { get; set; } 
} 

class Bar 
{ 
    public string Name { get; set; } 
} 

私はそのIグループ一緒FOOSのリストを持っていますsomeGroup?

答えて

7

同じ名前のバーが複数ある可能性はありますか?もしそうなら、それはやっかいです。ない場合は、あなただけにそれを変更できます。また

var grouped = from f in fooList 
       orderby f.SomeBar.Name ascending 
       group f by f.SomeBar into Group 
       select Group; 

var bars = grouped.Select(group => group.Key); 

だけ名前につき1つのバーをしたい場合、あなたはあなたの元のクエリにこだわることもできますが、最後のビットを変更します。

var someGroup = from f in fooList 
       orderby f.SomeBar.Name ascending 
       group f by f.SomeBar.Name into Group 
       select Group; 

var bars = someGroup.Select(group => group.First().SomeBar); 

これは各グループの最初のFooを取り、Barを見つけます。

0

あなたがBarのために特別なEquals実装によって、「明確なもの」を定義する場合は、使用できます。

var result = someGroup.SelectMany(x => x.Select(t => t.SomeBar)).Distinct(); 
0

人々は以前にも同様の質問をし、だから私はこの組み合わせみんなの知識をした:

var newlist<T2> = oldlist<T1>.GroupBy(g => g.distinct_var).Select(g => g.First()) //a 
       .Select(r=> new T2() {var1=r.va1, var2=r.var2 ...etc}).ToList(); //b 

それは何ですか:

a。最初の行は、あなたが望むものであるあなたの選択肢の別個の項目を選択します。

b。 2行目は、新しいT2リストを作成することによって、古いタイプ1を新しいタイプ2に変換します。

多分あなたの質問のために過剰ですが、必要のないものを切り抜くだけです。

関連する問題