161

Linqで.distinctを使用して、テーブルの1つのフィールドに基づいて結果を取得しようとしています(したがって、テーブルから複製されたレコード全体を必要としません)。

私は次のようにdistinctを使用して基本的なクエリを書くことを知っています:

var query = (from r in table1
orderby r.Text
select r).distinct();

r.textしかし、重複していない結果が必要です。

4

10 に答える 10

354

これを試して:

table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());

これにより、テーブルがグループ化されText、各グループの最初の行が使用され、Text異なる行が生成されます。

于 2013-01-14T15:09:17.857 に答える
32

MoreLinqには、使用できるDistinctByメソッドがあります。

それはあなたがすることを可能にします:

var results = table1.DistictBy(row => row.Text);

メソッドの実装(引数の検証を除く)は次のとおりです。

private static IEnumerable<TSource> DistinctByImpl<TSource, TKey>(IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
{
    HashSet<TKey> knownKeys = new HashSet<TKey>(comparer);
    foreach (TSource element in source)
    {
        if (knownKeys.Add(keySelector(element)))
        {
            yield return element;
        }
    }
}
于 2013-01-14T15:15:07.353 に答える
15

しかし、r.textが複製されていない結果が必要です

あなたがこれを望むように聞こえます:

table1.GroupBy(x => x.Text)
      .Where(g => g.Count() == 1)
      .Select(g => g.First());

Textこれにより、が一意である行が選択されます。

于 2013-01-14T15:09:32.463 に答える
12

上記のDanielHilgarthの回答は、 WithEntity -FrameworkSystem.NotSupportedの例外につながります。Entity-Frameworkでは、次のようにする必要があります。

table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());
于 2016-09-17T23:44:40.970 に答える
3

このトピックについてはたくさんの議論があります。

あなたはここでそれらの1つを見つけることができます:

最も人気のある提案の1つは、@ Servyが指摘しているように、ラムダ式をパラメーターとして使用するDistinctメソッドです。

C#のチーフアーキテクトであるAnders Hejlsbergは、ここで解決策を提案しました。また、フレームワーク設計チームがラムダを取るDistinctメソッドのオーバーロードを追加しないことを決定した理由を説明します。

于 2013-01-14T15:46:49.507 に答える
3

私が見つけたものから、あなたの質問はほとんど正しいです。「selectr」を「selectr.Text」に変更するだけで問題は解決します。これは、MSDNがどのように機能するかを文書化した方法です。

元:

    var query = (from r in table1 orderby r.Text select r.Text).distinct();
于 2014-08-22T19:01:34.320 に答える
1
data.Select(x=>x.Name).Distinct().Select(x => new SelectListItem { Text = x });
于 2017-01-18T06:26:39.037 に答える
-1

それがあなたの場合なら、はっきりとあなたに単一の列を返します!

CountryData.Select(x=>x.COUNTRY_NAME).Distinct()

それ以外の場合は、1つの列で区別される複数の列が必要です。最初にグループ化してから、グループから最初のアイテムを選択する 必要があります。(この場合、異なる値を持つグループ内の残りのアイテムは返されません)

CountryData.GroupBy(a=>a.COUNTRY_NAME).Select(a=>a.First());
于 2021-11-05T16:00:33.987 に答える
-2

このコードを試してください:

table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());
于 2017-07-24T10:18:46.507 に答える
-6

あなたはこれを試すことができます:table1.GroupBy(t => t.Text).Select(shape => shape.r)).Distinct();

于 2013-11-19T11:16:38.743 に答える