2010-05-12 2 views
0

Imaginez que vous ayez une énumération très longue, trop grande pour pouvoir être convertie en liste. Imaginez aussi que je veux supprimer les doublons de la liste. Imaginons enfin que je sache que seul un petit sous-ensemble de l'énumération initiale pourrait contenir des doublons. Le dernier point rend le problème pratique. Fondamentalement, je veux filtrer la liste en fonction de certains prédicats et appeler seulement Distinct() sur ce sous-ensemble, mais aussi recombiner avec l'énumération où le prédicat a renvoyé faux. Quelqu'un peut-il penser à une bonne façon idiomatique Linq de le faire? Je suppose que la question se résume à la suivante:Filtrage des sous-ensembles à l'aide de Linq

Avec Linq, comment pouvez-vous effectuer un traitement sélectif sur une énumération prédite et recombiner le flux de résultats avec les cas rejetés du prédicat?

Répondre

0

Vous pouvez le faire en parcourant la liste deux fois, une fois pour appliquer le prédicat et le dédoublement, et une seconde fois pour appliquer la négation du prédicat. Une autre solution est d'écrire votre propre variante de la méthode d'extension Where qui pousse les entrées qui ne correspondent pas dans un tampon sur le côté:

IEnumerable<T> WhereTee(this IEnumerable<T> input, Predicate<T> pred, List<T> buffer) 
{ 
    foreach (T t in input) 
    { 
     if (pred(t)) 
     { 
      yield return t; 
     } 
     else 
     { 
      buffer.Add(t); 
     } 
    } 
} 
0

Pouvez-vous donner un peu plus de détails sur la façon dont vous souhaitez recombiner les elments. Un moyen que je peux penser à résoudre ce problème est en utilisant l'opérateur Zip de. Net 4.0 comme ceci.

var initialList = new List<int>(); 

    var resjectedElemnts = initialList.Where(x=> !aPredicate(x)); 
    var accepetedElements = initialList.Where(x=> aPredicate(x)); 

    var result = accepetedElements.Zip(resjectedElemnts,(accepted,rejected) => T new {accepted,rejected}); 

Cela créera une liste de deux éléments rejetés et acceptés. Mais la taille de la liste sera limitée par la liste plus courte entre les deux entrées.