161

我正在尝试在 Linq 中使用 .distinct 来获取基于表的一个字段的结果(因此不需要表中的整个重复记录)。

我知道使用 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

Daniel Hilgarth上面的回答导致了一个System.NotSupported例外 With Entity-Framework。使用Entity-Framework,它必须是:

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

围绕这个话题有很多讨论。

你可以在这里找到其中之一:

正如@Servy 指出的那样,最受欢迎的建议之一是采用 lambda 表达式作为参数的 Distinct 方法。

C# 的首席架构师 Anders Hejlsberg 在这里提出了解决方案。还解释了为什么框架设计团队决定不添加采用 lambda 的 Distinct 方法的重载。

于 2013-01-14T15:46:49.507 回答
3

根据我的发现,您的查询大部分是正确的。只需将“select r”更改为“select r.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()

否则,如果您需要一列不同的多列。您需要先分组,然后从组中选择第一项。 (在这种情况下,不会返回组中具有不同值的其余项目)

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 回答