J'ai un problème intéressant, et je n'arrive pas à comprendre l'expression lambda pour que cela fonctionne.Utilisation d'expressions lambda pour obtenir un sous-ensemble où les éléments du tableau sont égaux
J'ai le code suivant:
List<string[]> list = GetSomeData(); // Returns large number of string[]'s
List<string[]> list2 = GetSomeData2(); // similar data, but smaller subset
List<string[]> newList = list.FindAll(predicate(string[] line){
return (???);
});
Je veux retourner uniquement les enregistrements dans la liste où l'élément 0 de chaque chaîne [] est égale à l'un des éléments 0 dans liste2.
listecontient des données comme ceci:
"000", "Data", "more data", "etc..."
liste2 contient des données comme ceci:
"000", "different data", "even more different data"
Au fond, je pourrais écrire ce code comme ceci:
List<string[]> newList = new List<string[]>();
foreach(var e in list)
{
foreach(var e2 in list2)
{
if (e[0] == e2[0])
newList.Add(e);
}
}
return newList;
Mais, je J'essaie d'utiliser des génériques et plus de lambda, donc je suis à la recherche d'une bonne solution propre. Celui-ci me frustrant cependant .. peut-être une trouvaille dans une trouvaille?
EDIT: réponse de Marc ci-dessous me conduire à expérimenter avec un varation qui ressemble à ceci:
var z = list.Where(x => list2.Select(y => y[0]).Contains(x[0])).ToList();
Je ne sais pas comment ce efficent est, mais il fonctionne et est suffisamment succincte. Quelqu'un d'autre a des suggestions?
Quelle est la raison du HashSet? Il semble bien fonctionner sans l'ensemble a (voir mon édition ci-dessus). Est-ce que le HashSet le rend plus efficace? –
note; Pour les très petites listes, il peut être plus efficace de simplement balayer la liste [comme le fait votre édition] ... mais pour les petites listes, il sera très rapide, quelle que soit l'approche utilisée. À mesure que la taille de la liste augmente, l'approche d'analyse peut rapidement devenir un goulot d'étranglement. –
Ok. Un élément d'information que je devrais mentionner est que les "clés" (ou list2) seront toujours relativement petites, probablement moins de 10. Alors que la source (liste) peut être plusieurs centaines d'éléments (jusqu'à 1000). –