2013-07-28 1 views
2

Как бы я искать значение в List<t> внутри другого List<t>C# Поиск Список <t> в другой список <T>

т.е.

//FooInner Class 
public class FooInner { 

    public int FooInnerId { get; set; } 
    public String FooValue { get; set; } 

} 

//FooOuter Class 
public class FooOuter { 

    public int FooOuterId { get; set; } 
    public List<FooInner> FooInnerCollection { get; set; } 

} 

Если я просто хотел найти значение внешнего класса

// Working code 

List<FooOuter> fooOuterCollection = GetSomeData(); 

var tmp = fooOuterCollection.Find(f => f.FooOuterId == 2); 

Но что, если бы я хотел FooInner Объект, где FooOuterId == 2 и FooInnerCollection.FooInnerId == 4 (или в зависимости от того, как вы на это смотрите).

Надеюсь, это имеет смысл.

+0

Все хорошее отвечает приветственным ребятам. –

ответ

3
fooOuterCollection 
    .Where(outer => outer.FooOuterID == 2) 
    .SelectMany(outer => outer.FooInnerCollection) 
    .FirstOrDefault(fooInner => fooInner.FooInnerId == 4); 

Сначала фильтр внешние объекты включают только те, у которых Id = 2

Тогда мы используем SelectMany выравниваться многочисленные InnerCollections, что мы можем найти

Наконец фильтр на основе внутреннего Id == 4

+0

Мне тоже нравится этот ответ :-) –

3

Вы можете получить внутренний объект, как this-

var temp= fooOuterCollection.Where(f => f.FooOuterId == 2) 
      .SelectMany(f => f.FooInnerCollection) 
      .FirstOrDefault(fi => fi.FooInnerId == 4)); 

Если вам нужен внешний объект, вам нужно использовать Any() метод расширения, чтобы увидеть, если inner list contains required element -

var temp = fooOuterCollection.FirstOrDefault(f => f.FooOuterId == 2 && 
       f.FooInnerCollection.Any(fi => fi.FooInnerId == 4); 
+1

это вернет внешний объект, а не внутренний – AlexFoxGill

+0

Это то, что я ищу, спасибо. На самом деле Алекс мой вопрос неверен, а не ответ, но хорошо замечен. Если у меня есть внешний объект, я могу добраться до внутреннего, так что это не проблема. :-) –

+0

Oops .. Я думал, что внешний элемент не требуется. Обновлено. Благодарю. –

0

Вы могли бы просто использовать синтаксис запросов LINQ в:

var results = from o in outerList 
     where o.FooOuterId == 2 
     from i in o.FooInnerCollection 
     where i.FooInnerId == 4 
     select i; 
+0

Приведёт правильный набор результатов, но апеллятору нужен один объект, поэтому вам понадобится FirstOrDefault() или эквивалент – AlexFoxGill

+0

Ах да, хорошее место! – Rob

Смежные вопросы