グループ化はここでは機能しません。
グループ化するとき、ランタイムは適切なグループを生成するためにグループキーを比較しようとします。ただし、グループキーでは、list
の各項目に対して別のIEnumerable<T>
というプロパティ(Ps
)を使用しています(比較はシーケンスの等価性ではなく、参照の等価性で行われます)ので、各要素ごとに異なるコレクションになります。あなたは下の画像から見ることができるようGroupBy
句は次の2つの異なる鍵を与える
var a = new { X = 1, Properties = new[] { "m" } };
var b = new { X = 1, Properties = new[] { "m" } };
:他の言葉であなたは、2つの項目があります場合。
あなたの目的はただ、あなたがグループ化を必要としない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());
データ構造を行います あなたが使う? 'list'、' i'、 'X'、' Properties'とは何ですか? – ASh