Croisez deux listes en C#
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]
4 réponses
Vous devez d'abord transformer data1, dans votre cas en appelant ToString()
sur chaque élément.
Utilisez ceci si vous voulez retourner des chaînes.
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);
Utilisez ceci si vous voulez retourner des entiers.
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 lancera une exception si toutes les chaînes ne sont pas des nombres. Donc, vous pouvez faire ce qui suit en premier 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 significativement , Vous pouvez essayer une telle approche (en utilisant l'opérateur conditionnel ?:):
1.Vous devez d'abord déclarer un convertisseur:
Converter<string, int> del = delegate(string s) { return Int32.Parse(s); };
2.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 des éléments de liste courte pour correspondre au type de liste plus longue. Imaginez une vitesse d'exécution si votre premier ensemble contient 1000 éléments et le second seulement 10 (ou le contraire peu importe); -)
Comme vous voulez avoir un résultat en tant que liste, dans une dernière ligne, vous convertissez le résultat (seul résultat) en int.
Si vous avez des objets, pas des structures (ou des chaînes), vous devrez d'abord croiser leurs clés, puis sélectionner des 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));
public static List<T> ListCompare<T>(List<T> List1 , List<T> List2 , string key )
{
return List1.Select(t => t.GetType().GetProperty(key).GetValue(t)).Intersect(List2.Select(t => t.GetType().GetProperty(key).GetValue(t))).ToList();
}