web-dev-qa-db-fra.com

Intersection de 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]

43
Merni

Vous devez d'abord transformer data1, dans votre cas, en appelant ToString() sur chaque élément.

Utilisez-le si vous souhaitez renvoyer 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-le si vous souhaitez renvoyer 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 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
}
67
George Duckett

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.

7
Slava Kovalchuk

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));
3
alexkovelsky