2016-09-16 15 views
0

このクエリをLINQで作成する方法を理解できません。 私は、次の例のクラスを持っている:Identifierは、一意の識別子とStartValueEndValue二つの整数であるリストによるLINQグループとグループ化された各プロパティの最初/最後

class Foo 
{ 
    string Identifier {get; set;} 
    int StartValue {get; set;} 
    int EndValue {get; set;} 
} 

は、私は次のリストに、私はグループの各識別子によって要素とそれら最初 StartValueをする 仲間と最後EndValueをしたいと思います

"11111" 1 2 
"11111" 2 3 
"11111" 3 4 
"22222" 1 2 

List<Foo> myList = new List<Foo>() 
myList.Add(new Foo { "11111", 1, 2 }) 
myList.Add(new Foo { "11111", 2, 3 }) 
myList.Add(new Foo { "11111", 3, 4 }) 
myList.Add(new Foo { "22222", 1, 2 }) 

より明確な入力リストを作成しました。

たとえば、私は出力リストに、StartValueという3つのstartValues(1)とEndValueの最後の1つの "11111"要素を持っていたいと思います。 4)。

結果一覧

"11111" 1 4 
"22222" 1 2 

私はこれをどのように達成すべき?ここで

答えて

4

グループを移動して最初の開始値と最後endValueのを選択 - ほとんどあなたが

それを記述するとおりに
var result = myList.GroupBy(x => x.Identifier) 
     .Select(x => new { 
       Identifier = x.Key, 
       FirstStart = x.First().StartValue, 
       LastEnd = x.Last().EndValue }); 

をあなたはまた戻ってするプロジェクトでしたあなたの元のオブジェクトを匿名オブジェクトよりも好む場合は、そのオブジェクトを削除します。

あなたの質問からあなたが最初/最後か最小/最大を望むかどうかは完全にはっきりしていないことに注意してください。 min maxを上記とほぼ同じにしたい場合

var result = myList.GroupBy(x => x.Identifier) 
     .Select(x => new { 
       Identifier = x.Key, 
       MinStart = x.Min(y => y.StartValue), 
       MinEnd = x.Max(y => y.EndValue) }); 

また、これを匿名の代わりにクラスに投影することもできます。

+0

申し訳ありませんが、私の間違いです。私は最初にmin/maxを求めましたが、私が編集したように、最初/最後を持っていきたいと思います。 first/lastとmax/minの両方のソリューションに感謝し、完璧に動作します – Rowandish

1

あなたは、識別子によって

IEnumerable<Foo> result = myList.GroupBy(x => x.Identifier) 
           .Select(x => new Foo() { 
            Identifier = x.Key, 
            StartValue = x.First().StartValue, 
            EndValue = x.Last().EndValue 
           }); 
関連する問題