2012-03-21 12 views
9

Tengo una lista de elementos y me preguntaba si alguien podría ayudarme con una expresión lambda para filtrar esta lista.Lambda Expresión para filtrar una lista de elementos

Esto es lo que se ve mi lista como:

List<List<Item>> myList = ExtractList(); 

Esto es lo que mi clase de artículo siguiente aspecto:

public class Item { 
    public string Name {get;set;} 
    public string Action {get;set;} 
} 

me gustaría filtrar esta lista y obtener sólo los suscriptores de la lista de elementos en los que el Nombre del elemento = "ABC" y el elemento Acción = "123".

Gracias por cualquier ayuda

+2

Se debe aclarar que la última frase, ¿desea una lista de listas que contienen ABC/123? ¿O quieres una lista de artículos que contengan ABC/123? – Guvante

+0

me gustaría obtener una lista de listas que contengan abc/123 – zSynopsis

Respuesta

25

simple:

myList.SelectMany(sublist => sublist) 
    .Where(item => item.Name == "ABC" && item.Action == "123"); 

Esto le da todos los elementos dentro de todas las listas.

Si desea seleccionar sub-listas que contienen el elemento en su lugar:

myList.Where(sublist => sublist.Any(item => item.Name == "ABC" && item.Action == "123")); 

Y por último, si desea conservar la misma estructura pero sólo mantener los elementos que coinciden con el filtro:

var newList = myList.Select(sublist => sublist 
         .Where(item => item.Name == "ABC" && item.Action == "123") 
         .ToList()).ToList(); 
+0

gracias romkyns! – zSynopsis

+0

¡Muchas gracias! Resolvió mi problema –

3

Aquí hay uno que obtiene listas que contienen en la lista un elemento que coincide con Name = "ABC" y Action = "123".

var newList = myList.Where(l => 
      l.Exists(i => i.Name == "ABC" 
        && i.Action == "123")).ToList(); 

Si sólo necesita una lista de elementos de la lista que coinciden con la condición, que puede hacer:

var newList = (from l in myList 
      where l.Exists(i => i.Name == "ABC" && i.Action == "123") 
      select l.Where(i => i.Name == "ABC" && i.Action == "123").ToList()).ToList(); 

Para aplanar la lista anterior (convertir en una lista simple en lugar de listas de listas), usted tiene que hacer un bucle foreach:

List<Item> newList2 = new List<Item>(); 
foreach(var list in newList) 
{ 
    newList2.AddRange(list); 
} 
+0

Es posible aplanar sin información previa: 'myList.SelectMany (l => l) .ToList()'. –

0

Esto puede funcionar;

List<Item> Items = new List<Item>(); 

myList.ForEach((item)=> 
{ 
    var items = item.Where(q=> q.Action == "123" && q.Name =="ABC"); 
    Items.AddRange(items); 
}); 
0

creo que la sintaxis de LINQ simple es el más fácil de leer:

var newList = 
    // gets the list of items 
    from listOfItems in myList 
    // extracts the list of items 
    from item in listOfItems 
    // filters by criteria 
    where item.Name == "ABC" && item.Action == "123" 
    // flattens into a IEnumerable<Item> 
    select item; 
Cuestiones relacionadas