3

複数のテーブルを結合し、3つのIEnumerableである新しい匿名型を選択するかなり複雑なLINQクエリがあります{Users, JobProviders, Jobs}遅延実行を維持するためにIQueryableを返します。これにより、この質問からDistintByが削除されます。

列の1つはランクであり、各ジョブ(別の列、多くのジョブが選択される)のランクが最も低いレコードのみが選択されるようにする必要があります。ランクによって行が明らかに一意になるため、Distinctは機能しません。

group句がこれに役立つと思いましたが、returntypeがIGroupingに変更されます。グループの仕組みがよくわからないので間違っているかもしれませんが、うまくいかないようです。仕事ごとに最低ランクだけをとる方法はありますか?

何かのようなもの

let jobRank = JobProvider.Rank
...where min(rank)
4

2 に答える 2

5

グループ化を使用できますが、groupBy を使用して別のことを行うのがうんざりします。を呼び出すだけFirstIGrouping、グループから 1 つの項目を取得できます。これは実質的に個別です。次のようになります。

var distinctItems = data.GroupBy(item => new{
  //include all of the properties that you want to 
  //affect the distinct-ness of the query
  item.Property1
  item.Property2
  item.Property3
})
.Select(group => group.Key);
//if it's important that you have the low rank use the one below.
// if you don't care use the line above
//.Select(group => group.Min(item => item.Rank));
于 2012-04-13T20:36:45.283 に答える
2

ここで良い解決策:

特定のプロパティに対する LINQ の Distinct()

必要なのは、効果的に「個別」です。書くのはかなり簡単ですが、現状ではLINQの一部だとは思いません。

What you need is a "distinct-by" effectively. I don't believe it's part of LINQ as it stands, although it's fairly easy to write:

public static IEnumerable<TSource> DistinctBy<TSource, TKey>
    (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
    HashSet<TKey> seenKeys = new HashSet<TKey>();
    foreach (TSource element in source)
    {
        if (seenKeys.Add(keySelector(element)))
        {
            yield return element;
        }
    }
}
于 2013-05-15T19:40:44.277 に答える