Intersecta dos listas en C #

Tengo dos listas:

List data1 = new List {1,2,3,4,5}; List data2 = new List{"6","3"}; 

Quiero hacer algo como

 var newData = data1.intersect(data2, lambda expression); 

La expresión lambda debería devolver true si data1[index].ToString() == data2[index]

Primero debe transformar datos1, en su caso llamando a ToString() en cada elemento.

Use esto si quiere devolver cadenas.

 List data1 = new List {1,2,3,4,5}; List data2 = new List{"6","3"}; var newData = data1.Select(i => i.ToString()).Intersect(data2); 

Use esto si quiere devolver enteros.

 List data1 = new List {1,2,3,4,5}; List data2 = new List{"6","3"}; var newData = data1.Intersect(data2.Select(s => int.Parse(s)); 

Tenga en cuenta que esto lanzará una excepción si no todas las cadenas son números. Entonces, puede hacer lo siguiente primero para verificar:

 int temp; if(data2.All(s => int.TryParse(s, out temp))) { // All data2 strings are int's } 

Desde el punto de vista del rendimiento , si dos listas contienen una cantidad de elementos que difieren significativamente , puede probar dicho enfoque (¿utilizando el operador condicional? :):

1. Primero debes declarar un convertidor:

 Converter del = delegate(string s) { return Int32.Parse(s); }; 

2. Luego usa un operador condicional:

 var r = data1.Count > data2.Count ? data2.ConvertAll(del).Intersect(data1) : data1.Select(v => v.ToString()).Intersect(data2).ToList().ConvertAll(del); 

Convierte elementos de una lista más corta para que coincida con el tipo de lista más larga. Imagine una velocidad de ejecución si su primer conjunto contiene 1000 elementos y el segundo solo 10 (o lo contrario, ya que no importa) 😉

Como desea tener un resultado como Lista, en una última línea convierte el resultado ( solo resultado ) a int.

 public static List ListCompare(List List1 , List List2 , string key ) { return List1.Select(t => t.GetType().GetProperty(key).GetValue(t)).Intersect(List2.Select(t => t.GetType().GetProperty(key).GetValue(t))).ToList(); }