2013-11-06 3 views
-3
Class A 
{ 

} 

Class B: A 
{ 

} 

Class C: A 
{ 
    B children; 
} 

У меня есть коллекция A с двумя членами B и C внутри нее.Лямбда-выражение для сплющивания

Например

collection A 
      -B 
      -B 
      -C 
       -B 
       -B 

В результате я ищу это:

B 
B 
B 
B 

Мне нужно извлечь коллекцию всех типов B из него с помощью лямбда-выражения. Идеи?

+8

Можете ли вы показать, что вы пробовали до сих пор? –

+0

Я новичок в C# и пробовал использовать select many, но не смог понять, как его получить. – user1527762

+0

Добро пожаловать в StackOverflow! Я вижу, что вы все еще немного новичок и просто хотите дать вам пару указателей: во-первых, при публикации на SO, обязательно включите в свой исходный пост (OP) любой код или вещи, которые вы пробовали. Можно сказать, что вы новичок в языке. Я поддержал ваш вопрос, потому что это трудная задача для кого-то нового для C# для решения, и я не думаю, что сообщение заслуживает 3-балльной оценки. Просто не забудьте включить эти детали в свои OP в будущем, и вы сделаете все правильно. Удачи и счастливого кодирования! :) –

ответ

3

Я хотел бы сделать что-то подобное.

Во-первых, получить элементы вашего списка, которые Б.

Тогда объединение с элементами из вашего списка, которые являются C, и выберите своих детей (что является B)

var list = yourList.OfType<B>() 
      .Union(yourList.OfType<C>().Select(x => x.children); 

Но ваш образец не ясен (или не прав с вашей псевдомоделью): дети - это одно свойство или коллекция?

Если это коллекция, используйте SelectMany вместо Select.

+1

Что делать, если глубина больше 2? – Servy

+1

@Servy - обратитесь к OP; глубина никогда не должна быть больше двух –

+0

@Servy Я, возможно, что-то пропустил, но как это могло случиться с этой структурой? –

0

Что вы ищете, это SelectMany.

http://pastebin.com/ZMD0NLZK

Это просто демо я сделал некоторое время назад, чтобы продемонстрировать разницу между Select и SelectMany.

EDIT: После дальнейшего смотреть, это выглядит как то, что вы действительно хотите, может быть .OfType<B>()

+0

1) Это не работает с неизвестной глубиной, а только с глубиной в два. – Servy

+0

Я дал ему инструменты, необходимые ему для решения проблемы. Оглядываясь назад, теперь есть лучший ответ. Тем не менее, это неправильный ответ, он просто требует, чтобы он собрал штуки. – Magus

+0

Не совсем, нет. На самом деле, решение проблемы обхода дерева довольно много, чем просто использование 'SelectMany'. На самом деле, лучшие решения, которые я видел, вообще не используют. И учитывая, что он не решает проблему, да, это неправильно. – Servy

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