2010-01-21 5 views
4

J'ai une liste d'objets. Chaque objet contient une propriété appelée "DisplayName". Je souhaite créer une autre liste d'objets chaîne, où chaque chaîne représente la première lettre ou le premier caractère (peut être un nombre) dans la propriété DisplayName pour tous les objets de la liste initiale et que la liste doit être distincte.Obtenir la liste alphabétique des éléments de la collection en utilisant Lambda/Linq?

Ainsi, par exemple, si ma liste contenait les trois objets suivants:

(1) DisplayName = 'Anthony' (2) DisplayName = 'Dennis (3) DisplayName = 'John'

je voudrais créer une autre liste contenant les trois chaînes suivantes:

(1) 'A' (2) 'D' (3) 'J'

Toute idée comment faire ceci avec un codage minimal en utilisant des expressions lambda ou linq?

+0

Pourquoi avez-vous besoin d'utiliser linq? –

Répondre

3

Comme ceci:

list.Select(o => o.DisplayName[0].ToString()) 
    .Where(s => Char.IsLetter(s, 0)) 
    .Distinct().ToList(); 

Edité

+0

Merci. Est-il possible de filtrer les résultats qui ont un caractère non-alpha? Je sais que mon post original a déclaré que c'était correct si le premier caractère était numérique ou un symbole - mais - je suis curieux de savoir si je peux filtrer ces résultats sur les résultats? – Chris

+0

Utilisez un appel Where avec l'une des méthodes statiques de Char. – SLaks

0

ou en notation de requête:

var stringList = (from a in objectList 
         select a.DisplayName.Substring(0,1)).Distinct(); 
+0

La syntaxe de compréhension de la requête est surfaite. – SLaks

1
List<myObject> mylist = new List<myObject>(); 
//populate list 
List<string> myStringList = myList 
    .Select(x => x.DisplayName.Substring(0,1)) 
    .Distinct() 
    .OrderBy(y => y); 

Dans le code ci-dessus, Select (avec il est lambda) retourne seulement premier caractère du nom d'affichage de l'objet x. Cela crée un IEnumerable de type string, qui est ensuite passé à Distinct(). Cela garantit que vous avez uniquement des éléments uniques dans la liste. Enfin, OrderBy s'assure que vos articles sont triés par ordre alphabétique.

Notez que si chacun des objets de la liste est de types différents, vous ne pourrez pas simplement appeler x.DisplayName. Dans ce cas, je créerais une interface, éventuellement appelée IDisplayName, qui implémente DisplayName. Ensuite, vous devriez être en mesure d'utiliser x => ((IDisplayName)x).DisplayName.Substring(0,1) dans votre lambda.

Questions connexes