Tengo una lista de parámetros como este:
public class parameter
{
public string name {get; set;}
public string paramtype {get; set;}
public string source {get; set;}
}
IEnumerable<Parameter> parameters;
Y una serie de cadenas con las que quiero compararlas.
string[] myStrings = new string[] { "one", "two"};
Quiero iterar sobre la lista de parámetros y verificar si la propiedad fuente es igual a cualquiera de la matriz myStrings. Puedo hacer esto con foreach anidados, pero me gustaría aprender cómo hacerlo de una manera más agradable, ya que he estado jugando con linq y me gustan los métodos de extensión en enumerable, como dónde, etc., por lo que los foreachs anidados se sienten mal. ¿Hay una forma linq / lambda / delegete preferida más elegante de hacer esto?
Gracias
Intersect
, será más rápido; si las listas son trivialmente cortas, no importa de una forma u otra (en ese caso, el rendimiento probablemente no sea su preocupación en absoluto de todos modos )parameters.Any(x => myStrings.Contains(x.source));
sería mejor que su primer ejemplo?Aquí hay una muestra para encontrar si hay elementos coincidentes en otra lista
List<int> nums1 = new List<int> { 2, 4, 6, 8, 10 }; List<int> nums2 = new List<int> { 1, 3, 6, 9, 12}; if (nums1.Any(x => nums2.Any(y => y == x))) { Console.WriteLine("There are equal elements"); } else { Console.WriteLine("No Match Found!"); }
fuente
Intersect
enfoque, ya que es O (N * M) en los tamaños de las listas. (Sin embargo, es O (1) en la memoria)Si ambas listas son demasiado grandes y cuando usamos la expresión lamda, llevará mucho tiempo recuperarlas. Es mejor usar linq en este caso para obtener la lista de parámetros:
var items = (from x in parameters join y in myStrings on x.Source equals y select x) .ToList();
fuente