62 votes

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 retourner true si data1[index].ToString() == data2[index]

86voto

George Duckett Points 17305

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

Utilisez ceci 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 ceci 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
}

10voto

alexkovelsky Points 41

Si vous avez des objets, pas des structures (ou des chaînes), vous devrez d'abord croiser 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));

-4voto

Islam Hassan Points 1
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();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X