2008-09-25 7 views

Répondre

-4

Bien que ce n'est pas un tutoriel, voici un code qui illustre le concept:

public List<string> ValidUsers(List<User> users) { 
    List<string> names = new List<string>(); 
    foreach(User user in users) { 
    if(user.Valid) { 
     names.Add(user.Name); 
    } 
    } 
    return names; 
} 
+11

Ceci n'est pas une compréhension de liste. – erikkallen

6

@Ian P

return (from user in users 
     where user.Valid 
     select user.Name).ToArray(); 
+1

Il n'a pas spécifié LINQ, je suis donc allé aussi basique que possible. Votre exemple est définitivement préféré. –

20

trouvé quand je cherchais comment faire compréhensions liste en C# ...

Quand quelqu'un dit des compréhensions de liste, je pense immédiatement à Python. Le code ci-dessous génère une liste qui ressemble à ceci:

[0,2,4,6,8,10,12,14,16,18] 

La façon Python est comme ceci:

list = [2*number for number in range(0,10)] 

En C#:

var list2 = from number in Enumerable.Range(0, 10) select 2*number; 

Les deux méthodes sont évaluées paresseusement.

47

Une compréhension de liste est un type de notation d'ensemble dans lequel le programmeur peut décrire les propriétés que les membres d'un ensemble doivent satisfaire. Il est généralement utilisé pour créer un ensemble basé sur d'autres ensembles ou ensembles existants en appliquant un certain type de combinaison, de transformation ou de réduction aux ensembles existants. Considérez le problème suivant: Vous avez une séquence de 10 nombres compris entre 0 et 9 et vous devez extraire tous les nombres pairs de cette séquence. Dans une langue une telle version C# 1.1, vous avez été à peu près limité au code suivant pour résoudre ce problème:

ArrayList evens = new ArrayList(); 
ArrayList numbers = Range(10); 
int size = numbers.Count; 
int i = 0; 

while (i < size) 
{ 
    if (i % 2 == 0) 
    { 
     evens.Add(i); 
    } 
    i++; 
} 

Le code ne montre pas au-dessus de la mise en œuvre de la fonction Range, qui est disponible dans le code complet liste ci-dessous. Avec l'avènement de C# 3.0 et du .NET Framework 3.5, une notation List Comprehension basée sur Linq est maintenant disponible pour les programmeurs C#. Le dessus du code C# 1.1 peut être porté à C# 3.0 comme ceci:

IEnumerable<int> numbers = Enumerable.Range(0, 10); 
var evens = from num in numbers where num % 2 == 0 select num; 

Et techniquement parlant, le code C# 3.0 ci-dessus pourrait être écrit en une ligne en déplaçant l'appel à Enumarable.Range au Expression Linq qui génère la séquence evens. Dans la compréhension de la liste C#, je réduis l'ensemble des numéros en appliquant une fonction (le modulo 2) à cette séquence. Cela produit la séquence evens d'une manière beaucoup plus concise et évite l'utilisation de la syntaxe de boucle. Maintenant, vous pouvez vous demander: est-ce purement de la syntaxe du sucre? Je ne sais pas, mais je vais certainement enquêter, et peut-être même poser la question moi-même ici. Je soupçonne que ce n'est pas seulement du sucre de syntaxe et qu'il y a de vraies optimisations qui peuvent être faites en utilisant les monades sous-jacentes.

La liste complète des codes est disponible here.

Questions connexes