À l'aide de LINQ, comment choisir conditionnelle de certains articles, mais lorsqu'aucune des conditions de sélectionner tous?
Je veux sélectionner les éléments à partir myCollection à l'aide de myFilters de filtrage:
var myFilters = new List<string> {"111", "222"};
var myCollection = new List<SomeClass> {
new SomeClass ("111"),
new SomeClass ("999")
};
from filter in myFilters
from item in myCollection
where item.Name == filter
select item
serait de retour "111".
Toutefois, si myFilters est vide je veux retourner tous les éléments de myCollection.
var myFilters = new List<string> ();
var myCollection = new List<SomeClass> {
new SomeClass ("111"),
new SomeClass ("999")
};
//Here's where I'm lost...
from filter in myFilters
from item in myCollection
where item.Name == filter
select item
serait de retour tous les articles ("111" et "999").
Vous ne serez pas en mesure de le faire avec une seule requête, car les types sont différents. Dans un cas, vous êtes de retour d'un IEnumerable<SomeClass> et dans l'autre, vous êtes de retour d'un IEnumerable<string>. Les choses seraient différentes si votre requête est terminée avec sélectionner un élément.Nom au lieu de sélectionner un élément.
"première collection" et "deuxième de la collection" serait plus clair si la variable locale noms ont été référencé au lieu. Quelque chose comme: "Toutefois, lorsque
Vous avez raison. Beaucoup plus clair maintenant, je pense.
Je sais que je suis un peu en retard, peut vous fournir le code de votre SomeClass? Je me demande à quoi ça constructeur retourne.
Ainsi, un constructeur renvoie une instance de SomeClass.
"première collection" et "deuxième de la collection" serait plus clair si la variable locale noms ont été référencé au lieu. Quelque chose comme: "Toutefois, lorsque
myFilters
est vide, je veux le retour de tous les articles dans myCollection
sans filtrage."Vous avez raison. Beaucoup plus clair maintenant, je pense.
Je sais que je suis un peu en retard, peut vous fournir le code de votre SomeClass? Je me demande à quoi ça constructeur retourne.
Ainsi, un constructeur renvoie une instance de SomeClass.
OriginalL'auteur Stécy | 2012-09-13
Vous devez vous connecter pour publier un commentaire.
Si ces collections vont être considérables, alors je vous recommande d'utiliser une jointure. Il ressemblerait à quelque chose comme ceci:
Possibilités pour l'utilisation de jointures sont facilement négligés. Cette jointure sera mieux que l'contient approche, quand les listes sont à distance de grands. Si ils sont petits et que les performances sont acceptables, puis utilisez celui qui semble le plus clair.
OriginalL'auteur devgeezer
OriginalL'auteur cuongle
Le meilleur que vous allez être en mesure de faire est de projet les filtres dans SomeClass. Quelque chose comme:
Il fonctionne pour moi dans VS2010.
Notez que c'est pas un sous-ensemble de filtré les instances de
myCollection
mais une projection de la nouvelleSomeClass
des instances créées à partir de la correspondance demyFilters
valeurs.Il ne fonctionne pas (en LINQPad 4) lorsque myFilters est vide. L'OP a écrit "si la seconde collection est vide", mais signifie la collection de filtres. Si vous n'avez pas de filtres, vous devriez obtenir l'intégralité de la collection; à la place (avec cette requête) vous obtenez un vide de la collection.
OriginalL'auteur itsme86
Comment à ce sujet?
De la sélection de deux collections effectue une jointure basée sur votre clause where. La condition de jointure ci-dessus, dit rejoindre sur le point.Nom de l'égalité de filtrer OU de sélectionner si il n'y a pas de filtres disponibles.
OriginalL'auteur armen.shimoon
Essayez ceci:
Il serait peut-être mieux compter filtre de collection qu'une seule fois:
MODIFIER
Je dirais même que la réponse de @itsme86 est correct, mais, je pense, il l'a confondu vos collections. Donc sa réponse devrait ressembler en quelque sorte comme ceci:
Count() == 0
vous pouvez utiliserAny()
. Il ne sera pas seulement d'exécuter mieux (il a seulement besoin d'obtenir le premier élément à savoir s'il ya des contre avoir besoin de récupérer chaque élément pour obtenir le nombre) mais aussi du point de vue sémantique signifie exactement ce que vous essayez de faire.En fait j'ai
Any
variante dans ma réponse. Bref, merci pour la clarification.La levée de l'
Any()
de la où le prédicat est une bonne chose en terme de performance. Une bonne chose à propos de quitter leAny()
dans le prédicat est si la requête est détenu sur et lemyFilters
oumyCollection
listes sont modifiés (par exemple, effacé, les éléments, les éléments supprimés), puis après itération fournira le résultat mis à jour.OriginalL'auteur horgh