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]

33
demandé sur Gareth 2011-08-25 13:27:55

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
}
60
répondu George Duckett 2011-08-25 09:35:40

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.

6
répondu Slava Kovalchuk 2011-08-25 11:38:23

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));
-1
répondu alexkovelsky 2018-09-10 15:07:24
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();


}
-2
répondu islam hassan 2016-11-15 23:23:58