Лямбда-выражение для фильтрации списка элементов списка - PullRequest
10 голосов
/ 21 марта 2012

У меня есть список списка элементов, и мне было интересно, может ли кто-нибудь помочь мне с лямбда-выражением отфильтровать этот список.

Вот как мой список выглядит:* Вот как выглядит мой класс Item:

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

Я бы хотел отфильтровать этот список и получить только те списки списка элементов, в которых Item Name = "ABC" и item Action = "123".

Спасибо за любую помощь

Ответы [ 4 ]

28 голосов
/ 21 марта 2012

Простой:

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

Это дает вам все элементы во всех списках.

Если вы хотите выбрать подсписки, которые содержат элемент вместо:

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

И, наконец, если вы хотите сохранить ту же структуру, но сохранить только те элементы, которые соответствуют фильтру:

var newList = myList.Select(sublist => sublist
                       .Where(item => item.Name == "ABC" && item.Action == "123")
                       .ToList()).ToList();
3 голосов
/ 21 марта 2012

Вот тот, который получает списки, содержащие в списке один элемент, соответствующий Name = "ABC" и Action = "123".

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

Если вам нужен только список элементов списка, соответствующих условию, вы можете сделать:

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();

Чтобы сгладить список выше (преобразовать в простой список вместо списков списков), вам нужно сделать цикл foreach:

List<Item> newList2 = new List<Item>();
foreach(var list in newList)
{
    newList2.AddRange(list);
}
0 голосов
/ 21 марта 2012

Я думаю, что простой синтаксис LINQ легче всего читать:

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;
0 голосов
/ 21 марта 2012

Это может сработать;

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

myList.ForEach((item)=>
{
   var items = item.Where(q=> q.Action == "123" && q.Name =="ABC");
   Items.AddRange(items);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...