Почему LINQ не включает ключевое слово `Different`? - PullRequest
17 голосов
/ 12 ноября 2010

ПРИМЕЧАНИЕ. Прежде чем читать или предоставить ответ, я знаю о Enumerable.Distinct, я спрашиваю о конкретной языковой поддержке для этого метода, а не о самом методе.

Мне всегда было интересно, почему в наборе ключевых слов C # LINQ нет ключевого слова distinct, чтобы я мог написать:

var items = distinct from x in y
            select x;

или

var items = from x in y
            select distinct x;

Кто-нибудь знает, почему это не было включено или почему было бы плохой идеей включать это? Мне просто кажется громоздким, что я должен обернуть запрос, чтобы вызвать Distinct(); ключевое слово distinct показалось бы более естественным.

ПРИМЕЧАНИЕ. Я знаю, что метод Distinct имеет переопределения для предоставления компаратора, если это требуется, но ключевое слово, которое использует компаратор по умолчанию, было бы хорошо. Я мог бы даже представить комбинацию ключевых слов distinct by, чтобы оператор запроса мог быть встроен в запрос.

Ответы [ 3 ]

14 голосов
/ 12 ноября 2010

В VB есть .

Dim l = From x In {1, 2, 3, 2, 4, 2} Distinct Select x

Я не подозреваю, что было принято какое-то активное решение против distinct для C #, просто оно не было реализовано.

10 голосов
/ 12 ноября 2010

У Чарли Калверта есть запись в блоге («Использование отличных и избегающих лямбд») , где обсуждается проблема. С вершины поста:

  1. Большинство операторов запросов, таких как Select(), Where() и GroupBy(), принимают в качестве параметра нечто, называемое лямбда-выражением.
  2. Лямбды трудно писать.
  3. Выражения запросов были созданы в значительной степени, чтобы позволить разработчикам использовать LINQ без необходимости изучать сложный синтаксис, связанный с лямбдами.
  4. Некоторые операторы запросов, такие как Distinct(), не принимают лямбда-выражения в качестве параметров. В результате их легко вызвать.
  5. Поэтому выражения запросов не были созданы для таких операторов, как Distinct(), которые не принимают лямбда-выражения.

А также, далее вниз в сообщении:

Операторы запросов являются вызовами методов. Другими словами, в LINQ API есть методы, называемые Select(), Group(), Distinct() и т. Д. Мы обычно не вызываем эти методы напрямую, потому что они принимают лямбда-выражения в качестве параметров, и многие люди считают, что лямбда-выражения сложны чтобы понять. Чтобы помочь разработчикам избежать сложной задачи написания лямбда-выражений, команда изобрела выражения запросов, которые являются «синтаксическим сахаром», стоящим поверх лямбда-выражений.

TL; DR: Для простоты нет ключевого слова distinct, поскольку distinct не принимает лямбда-выражения.

5 голосов
/ 12 ноября 2010

Reword: distinct является оператором множества ... операторы множества не принимают лямбда-выражения в качестве параметров. Команда c # решила дать вам ярлыки методов, которые принимают лямбды, такие как Select() и Group(), потому что они чувствовали, что лямбды могут сбить с толку людей, только начинающих. .Distinct() не принимает лямбду, поэтому ясно, когда вы вызываете ее напрямую.

Хорошая статья по теме:
http://blogs.msdn.com/b/charlie/archive/2006/11/19/linq-farm-group-and-distinct.aspx

...