Intersecta dos listas en C#
intersection (4)
Tengo dos listas:
List<int> data1 = new List<int> {1,2,3,4,5};
List<string> data2 = new List<string>{"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]
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<string, int> del = delegate(string s) { return Int32.Parse(s); };
2. Luego usa un operador condicional:
var r = data1.Count > data2.Count ?
data2.ConvertAll<int>(del).Intersect(data1) :
data1.Select(v => v.ToString()).Intersect(data2).ToList<string>().ConvertAll<int>(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.
Primero debe transformar datos1, en su caso llamando a ToString()
en cada elemento.
Use esto si quiere devolver cadenas.
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);
Use esto si quiere devolver enteros.
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));
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
}
Si tiene objetos, no estructuras (o cadenas), primero tendrá que intersecar sus teclas, y luego seleccionar objetos con esas teclas:
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();
}
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(); }