2011-07-31 3 views
8

Il y a un S struct avec 2 champs de chaîne: A et B.LINQ sélectionner les chaînes non vides

Je veux convertir un tableau de S en tableau de chaînes, contenant tous comme non vide unique et hôtes. Quel est le moyen le plus efficace pour cela?

Cordialement,

Répondre

11
var myArray = S.Select(x => new [] { x.A, x.B }) 
       .SelectMany(x => x) 
       .Where(x=> !string.IsNullOrEmpty(x)) 
       .Distinct() 
       .ToArray(); 

Au-dessus ne fonctionne que si la contrainte unique est sur la collection résultant - si vous avez besoin d'une contrainte unique sur l'ensemble des A suivantes serait de son et B travailler:

var As = S.Select(x => x.A) 
      .Where(x=> !string.IsNullOrEmpty(x)) 
      .Distinct(); 
var Bs = S.Select(x => x.B) 
      .Where(x=> !string.IsNullOrEmpty(x)) 
      .Distinct(); 

var myArray = new [] {As, Bs} .SelectMany (x => x) .ToArray();

var myArray = As.Concat(Bs).ToArray(); 
+0

@Joey: Oui, mis à jour - hypothèse est unique est nécessaire sur les A et B n'est pas sur la collection qui en résulte, autrement première approche serait mieux – BrokenGlass

+1

Pour mémoire, 'As.Concat (Bs)' serait faire la même chose que le 'SelectMany' –

+0

@Claus Jørgensen: Doh! Et c'est beaucoup plus simple et lisible, édité cela dans. – BrokenGlass

Questions connexes