2010-11-12 9 views
17

NOTE: Avant de lire ou de fournir une réponse, je connais le Enumerable.Distinct, je pose des questions sur la prise en charge d'un langage spécifique pour cette méthode, et non sur la méthode elle-même.Pourquoi LINQ n'inclut pas un mot clé `distinct`?

Je me suis toujours demandé pourquoi il n'y a pas de mot clé distinct dans le mot-clé C# LINQ fixé pour que je puisse écrire:

var items = distinct from x in y 
      select x; 

ou

var items = from x in y 
      select distinct x; 

Quelqu'un sait pourquoi cela n'a pas été inclus ou pourquoi ce serait une mauvaise idée de l'inclure? Cela me semble lourd que je dois envelopper la requête juste pour appeler Distinct(); un mot-clé distinct serait plus naturel.

NOTE: Je sais que la méthode Distinct a des remplacements pour fournir un comparateur si nécessaire, mais un mot clé qui utilise le comparateur par défaut serait génial. Je pourrais même imaginer une combinaison de mots-clés distinct by afin qu'un opérateur de comparaison puisse être fourni en ligne à la requête.

+1

Je souhaite que nous avions aussi. Serait beaucoup plus lisible, et ime il est raisonnablement souvent utilisé. –

+0

@qstarin: J'ai posé la question car j'en avais besoin pour la 5ème fois en 2 jours. –

+0

Peut-être que nous devrions commencer un groupe facebook "mot-clé distinct pour C#". Il a obtenu Betty White sur SNL ... –

Répondre

10

Charlie Calvert a un blog post ("Using Distinct and Avoiding Lambdas") pour discuter du problème. Du haut du poste:

  1. La plupart des opérateurs de requête tels que Select(), Where() et GroupBy() prennent ce qu'on appelle un lambda comme paramètre.
  2. Les lambdas sont difficiles à écrire.
  3. Les expressions de requête ont été créées en grande partie pour permettre aux développeurs d'utiliser LINQ sans avoir à apprendre la syntaxe complexe associée à lambdas.
  4. Certains opérateurs de requête, tels que Distinct(), ne prennent pas en paramètre lambdas. En conséquence, ils sont faciles à appeler.
  5. Les expressions de requête n'ont donc pas été créées pour des opérateurs tels que Distinct() qui ne prennent pas de lambda.

Et aussi, de plus bas dans le poste:

opérateurs de requête sont des appels de méthode. En d'autres termes, il existe des méthodes dans l'API LINQ appelées Select(), Group(), Distinct(), etc. Nous n'appelons généralement pas ces méthodes directement parce qu'elles prennent les lambdas comme paramètres, et beaucoup de gens trouvent que les lambdas sont difficiles à comprendre. Pour aider les développeurs à éviter la tâche complexe de l'écriture de lambdas, l'équipe a inventé des expressions de requête, qui sont un «sucre syntaxique» placé au-dessus des lambdas.

TL; DR: Il n'y a pas mot-clé pour distinct Par souci de simplicité, puisque distinct ne prend pas une expression lambda.

+2

Bonne réponse, merci. Tout cela sonne bien, mais cela ne correspond pas à la façon dont les gens utilisent ce genre de choses. Ce serait extrêmement utile et rendrait les choses beaucoup plus faciles à lire. Je ne pense pas que l'argument mis en avant par Charlie Calvert soit vraiment fort - d'autant plus que le mot-clé WAS était inclus pour VB. –

+6

"Nous n'appelons pas ces méthodes directement parce qu'elles prennent les lambdas comme paramètres, et beaucoup de ** programmeurs moche qui ne valent pas leur sel ** trouvent que les lambdas sont difficiles à comprendre" - FTFY. – Juliet

+2

Tout à fait d'accord avec vous deux. Les Lambdas ne sont pas si difficiles, et j'ai déjà été surpris par ça - "attendez, donc il y a une méthode' Distinct() 'mais pas de mot-clé' distinct'? " Ça n'a pas beaucoup de sens pour moi. – Donut

14

En VB, est actuellement.

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

Je ne pense pas qu'il y ait eu une décision active contre distinct C#, il est juste n'a pas été mis en œuvre.

+0

Bien sûr, je ne veux pas avoir à écrire tous mes LINQ en VB. :) –

+2

VB prend également en charge 'Take' et' Skip' dans le format de requête. –

+0

VB a également 'Aggregate ... Into' en format de requête? Est-ce que cela existe aussi en C#? – Dario

5

Reword: distinct est un opérateur d'ensemble ... les opérateurs ne prennent pas les lambdas comme paramètres. L'équipe C# a décidé de vous donner des raccourcis vers des méthodes qui prennent des lambdas, tels que Select() et Group(), parce qu'ils pensaient que les lambdas pouvaient être déroutants pour les débutants. .Distinct() ne prend pas de lambda, donc c'est clair quand vous l'appelez directement.

Une bonne lecture sur le sujet:
http://blogs.msdn.com/b/charlie/archive/2006/11/19/linq-farm-group-and-distinct.aspx

+1

Cela explique la distinction, mais je ne pense toujours pas qu'il répond à la question. 'in' n'utilise pas de lambda. C'est une commodité. L'argument est erroné, surtout quand on voit que VB a le mot-clé. Je pense que la justification est faible - ce n'est pas une critique de votre réponse lorsque vous relayez l'information, mais vous comprenez ce que je veux dire. –

+0

Reformulé. Vous avez raison, la clé est que c'est juste une commodité. L'équipe C# a décidé qu'il n'y avait pas besoin de commodité sur '.Distinct()' (Apparemment, l'équipe VB n'était pas d'accord) –

+1

Je pense qu'ils ont pris une mauvaise décision en ce qui concerne distincte. –

Questions connexes