Отличается в Linq на основе только одного поля таблицы
Я пытаюсь использовать .distinct в Linq, чтобы получить результат, основанный на одном поле таблицы (так что не нужно целых дублированных записей из таблицы).
Я знаю, как писать базовый запрос, используя следующие выражения:
var query = (from r in table1
orderby r.Text
select r).distinct();
но мне нужны результаты, где r.text
не дублируется.
Ответы
Ответ 1
Попробуйте следующее:
table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());
Это будет группировать таблицу с помощью Text
и использовать первую строку из каждой группы, в результате чего строки, где Text
являются различными.
Ответ 2
В 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;
}
}
}
Ответ 3
но мне нужны результаты, где r.text не дублируется
Звучит так, как будто вы этого хотите:
table1.GroupBy(x => x.Text)
.Where(g => g.Count() == 1)
.Select(g => g.First());
Это приведет к выбору строк, где Text
уникален.
Ответ 4
Из того, что я нашел, ваш запрос в основном правильный. Просто измените "select r" на "select r.Text" - это все, и это должно решить проблему. Вот как MSDN документировала, как он должен работать.
Пример:
var query = (from r in table1 orderby r.Text select r.Text).distinct();
Ответ 5
Даниэль Хильгарт ответ выше приводит к исключению System.NotSupported с Entity-Framework. С Entity-Framework это должно быть:
table1.GroupBy(x = > x.Text). Выберите (x = > x.FirstOrDefault());
Ответ 6
В этой теме много дискуссий.
Вы можете найти один из них здесь:
Одним из самых популярных предложений был метод Distinct, в котором выражение лямбда было указано как параметр, который указал @Servy.
Главный архитектор С# Андерс Хейлсберг предложил решение здесь. Также объяснялось, почему команда дизайна каркаса решила не добавлять перегрузку метода Distinct, который принимает лямбда.
Ответ 7
data.Select(x=>x.Name).Distinct().Select(x => new SelectListItem { Text = x });
Ответ 8
попробуйте этот код:
table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());
Ответ 9
Вы можете попробовать следующее: table1.GroupBy(t => t.Text).Select(shape => shape.r)).Distinct();