Подтвердить что ты не робот

Почему LINQ не включает ключевое слово `distinct`?

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

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

var items = distinct from x in y
            select x;

или

var items = from x in y
            select distinct x;

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

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

4b9b3361

Ответ 1

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

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

А также из дальнейшего сообщения:

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

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

Ответ 2

В VB на самом деле есть.

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

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

Ответ 3

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

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