Почему 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
, чтобы оператор сравнения мог быть предоставлен встроенным в запрос.
Ответы
Ответ 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