J'ai deux listes:
List<int> data1 = new List<int> {1,2,3,4,5};
List<string> data2 = new List<string>{"6","3"};
Je veux faire quelque chose comme
var newData = data1.intersect(data2, lambda expression);
L'expression lambda doit renvoyer true si data1[index].ToString() == data2[index]
Vous devez d'abord transformer data1, dans votre cas, en appelant ToString()
sur chaque élément.
List<int> data1 = new List<int> {1,2,3,4,5};
List<string> data2 = new List<string>{"6","3"};
var newData = data1.Select(i => i.ToString()).Intersect(data2);
List<int> data1 = new List<int> {1,2,3,4,5};
List<string> data2 = new List<string>{"6","3"};
var newData = data1.Intersect(data2.Select(s => int.Parse(s));
Notez que cela lèvera une exception si toutes les chaînes ne sont pas des nombres. Vous pouvez donc d'abord procéder comme suit pour vérifier:
int temp;
if(data2.All(s => int.TryParse(s, out temp)))
{
// All data2 strings are int's
}
De point de performance de vue si deux listes contiennent nombre d'éléments qui diffèrent considérablement, vous pouvez essayer une telle approche (en utilisant l'opérateur conditionnel? :):
1.Tout d'abord, vous devez déclarer un convertisseur:
Converter<string, int> del = delegate(string s) { return Int32.Parse(s); };
Ensuite, vous utilisez un opérateur conditionnel:
var r = data1.Count > data2.Count ?
data2.ConvertAll<int>(del).Intersect(data1) :
data1.Select(v => v.ToString()).Intersect(data2).ToList<string>().ConvertAll<int>(del);
Vous convertissez les éléments d'une liste plus courte pour correspondre au type de liste plus longue. Imaginez un vitesse d'exécution si votre premier ensemble contient 1000 éléments et le second seulement 10 (ou l'opposé car cela n'a pas d'importance) ;-)
Comme vous voulez avoir un résultat sous forme de liste, dans une dernière ligne, vous convertissez le résultat (seul résultat) en entier.
Si vous avez des objets, pas des structures (ou des chaînes), vous devrez d'abord intersecter leurs clés, puis sélectionner les objets par ces clés:
var ids = list1.Select(x => x.Id).Intersect(list2.Select(x => x.Id));
var result = list1.Where(x => ids.Contains(x.Id));