Sélectionnez à partir d'une Liste<T>
Je suis sûr qu'il ya une wasy façon de le faire (je suppose que l'une des méthodes d'extension?), mais je suis mal à le trouver avec Google.
Fondamentalement, j'ai une Liste de classes personnalisées; je veux sélectionner certains éléments de cette dans une nouvelle Liste où l'une des propriétés est égale à une valeur dans une autre Liste.
Voici un (simplifié) un exemple de ce que je suis en train de faire:
public class Job
{
public int Number;
public string ClientCompanyName;
}
List<Job> lstJobs = new List<Job>();
List<Job> lstCompare = new List<Job>();
normalement, je devrais faire quelque chose comme:
List<Job> lstFiltered = new List<Job>();
foreach(Job jobThis in lstCompare)
{
foreach(jobComp in lstCompare)
{
if(jobThis.Number = jobComp.Number)
{
lstFiltered.Add(jobThis);
}
}
}
Est là une méthode d'extension qui neatens de ce dernier en (idéalement) une seule ligne?
Acclamations
OriginalL'auteur Jez Clark | 2011-04-06
Vous devez vous connecter pour publier un commentaire.
La solution ci-dessus fonctionne bien que si le nombre d'éléments dans la
lstCompare
est petit. Pour les grandes listes de comparaison que vous pouvez utiliser certaines de hachage collection.Si les conditions de la comparaison est plus complexe ou qu'il est nécessaire, dans plusieurs endroits, vous devez créer un comparateur de classe qui implémente
IEqualityComparer<T>
. Ensuite, vous pouvez utiliser leIntersect()
méthode comme d'autres l'ont déjà suggéré. Cependant, il n'est pas fonctionnellement identiques avec les solutions ci-dessus. Il ne renvoie que des éléments distincts, tandis que mes solutions de retourner tous les éléments correspondants. Il peut y avoir une différence significative dans certaines applications.Mon deuxième exemple peut être facilement modifié pour utiliser
IEqualityComparer<T>
si nécessaire. LeHashSet<T>
prend le comparer comme deuxième paramètre.OriginalL'auteur mgronber
Vous pouvez utiliser
Intersect()
pour cela:http://msdn.microsoft.com/en-us/library/bb460136.aspx
OriginalL'auteur C.Evenhuis
Utilisation
Intersect
.Pour qu'il fonctionne avec votre comparaison personnalisée, vous avez besoin pour mettre en œuvre
IEquatable<T>
dans votre classe ou de créer une nouvelle classe implémenteIEqualityComparer<T>
pour votre classe et votre pass qu'à la surcharge deIntersect
.OriginalL'auteur Daniel Hilgarth
Jez,
Vous pourriez être en mesure d'utiliser LINQ
intersect
fonction, ou à essayer:ou la syntaxe LINQ:
et voilà reSharper la version en fonction de votre boucle d'origine:
légèrement verbeux, mais d'une autre façon à la peau du chat.
[édité] comme l'a réglé sur la nouvelle liste, plutôt que les éléments sélectionnés - doh
OriginalL'auteur jim tollan