2016-04-14 9 views
0

私はこのようにLINQ文を書いた:Linqを使用して列挙可能なグループフィールド?

var fs = list 
    .GroupBy(i => 
     new { 
      X = i.X, 
      Ps = i.Properties.Where(p => p.Key.Equals("m")) <<<<<<<<<<< 
     } 
    ) 
    .Select(g => g.Key }); 

は私がIEnumerable.Where(...)フィールドをグループにできますか?

+0

データ構造を行います あなたが使う? 'list'、' i'、 'X'、' Properties'とは何ですか? – ASh

答えて

0

グループ化はここでは機能しません。

グループ化するとき、ランタイムは適切なグループを生成するためにグループキーを比較しようとします。ただし、グループキーでは、listの各項目に対して別のIEnumerable<T>というプロパティ(Ps)を使用しています(比較はシーケンスの等価性ではなく、参照の等価性で行われます)ので、各要素ごとに異なるコレクションになります。あなたは下の画像から見ることができるようGroupBy句は次の2つの異なる鍵を与える

var a = new { X = 1, Properties = new[] { "m" } }; 
var b = new { X = 1, Properties = new[] { "m" } }; 

:他の言葉であなたは、2つの項目があります場合。

Grouping result

あなたの目的はただ、あなたがグループ化を必要としないGroupByキーの構造に項目を投影することであるならば、あなたが異なったことの結果を必要としますならば

var fs = list.Select(item => new 
{ 
    item.X, 
    Ps = item.Properties.Where(p => p.Key == "m") 
}); 

しかし、あなたはあなたの結果のために別のクラスを作成する必要があるとDistinctで使用する別のIEqualityComparer<T>を実装します:以下のクエリは、同じ結果を与える必要があります句:

あなたは明確な結果を得るために、最初のクエリに Distinctを使用することができ、上記持つ
public class Result 
{ 
    public int X { get; set; } 
    public IEnumerable<string> Ps { get; set; } 
} 

public class ResultComparer : IEqualityComparer<Result> 
{ 
    public bool Equals(Result a, Result b) 
    { 
     return a.X == b.X && a.Ps.SequenceEqual(b.Ps); 
    } 

    // Implement GetHashCode 
} 

var fs = list.Select(item => new Result 
{ 
    X = item.X, 
    Ps = item.Properties.Where(p => p.Key == "m") 
}).Distinct(new ResultComparer()); 
関連する問題