una obtener lista elemento con buscar c# linq linq-to-sql linq-to-objects

c# - obtener - LINQ devuelve elementos en una lista que coincide con cualquier nombre(cadena) en otra lista



list where c# (5)

Podría crear un IEqualityComparer<T> que diga que los productos con los mismos nombres son iguales.

class ProductNameEqulity : IEqualityComparer<Product> { public bool Equals(Product p1, Product p2) { return p1.Name == p2.Name } public int GetHashCode(Product product) { return product.Name.GetHashCode(); } }

Luego puedes usar esto en el método de extensión Intersect .

var products = shopProducts.Intersect(listOfProducts, new ProductNameEquality());

Tengo 2 listas. 1 es una colección de productos. Y el otro es una colección de productos en una tienda.

Necesito poder devolver todos los productos de la tienda si los nombres coinciden con los nombres de los productos.

Tengo esto, pero parece que no funciona. ¿Algunas ideas?

var products = shopProducts.Where(p => p.Name.Any(listOfProducts. Select(l => l.Name).ToList())).ToList();

Debo decir que me den todos los productos de la tienda donde el nombre existe en la otra lista.


Podrías usar una unión, por ejemplo:

var q = from sp in shopProducts join p in listOfProducts on sp.Name equals p.Name select sp;

Una guía más completa sobre unirse está here .


Prueba esto por favor

var products = shopProducts.Where(m=> listOfProducts.Select(l=>l.Name).ToList().Contains(m=>m.Name));


var products = shopProducts .Where(shopProduct => listOfProducts.Any(p => shopProduct.Name == p.Name)) .ToList();


var products = shopProducts.Where(p => listOfProducts.Any(l => p.Name == l.Name)) .ToList();

Para LINQ-to-Objects, si listOfProducts contiene muchos elementos, puede obtener un mejor rendimiento si crea un HashSet<T> contenga todos los nombres necesarios y luego lo use en su consulta. HashSet<T> tiene un rendimiento de búsqueda O (1) en comparación con O (n) para un IEnumerable<T> arbitrario.

var names = new HashSet<string>(listOfProducts.Select(p => p.Name)); var products = shopProducts.Where(p => names.Contains(p.Name)) .ToList();

Para LINQ-to-SQL, esperaría (¿espero?) Que el proveedor pueda optimizar el SQL generado automáticamente sin necesidad de ningún ajuste manual de la consulta.