2010-07-25 3 views
2

У меня есть что-то вроде следующих классов:FirstOrDefault по коллекции объектов

public class Animal 
{ 
    ... 
} 

public class Cow : Animal 
{ 
    ... 
} 

public class AnimalCollection : List<Animal> 
{ 
    public Animal GetFirstAnimal<T>() 
    { 
     foreach(Animal animal in this) 
     { 
      if(animal is T) 
       return T as Animal 
     } 

     return null; 
    } 
} 

несколько вопросов: Можно ли использовать FirstOrDefault на коллекции вместо того, чтобы метод GetFirstAnimal()? Какой будет синтаксис, если можно? И что будет наиболее эффективным? Это не будет массовая коллекция.

В качестве альтернативы, есть ли лучший способ сделать то же самое все вместе?

+2

FYI, это не набор классов, это набор объектов. –

+1

Уже поздно, и у меня есть грипп человека, отредактированы, чтобы исправить –

ответ

10
var firstCow = animals.OfType<Cow>().FirstOrDefault(); 
+0

Да - я действительно имел в виду FirstOrDefault. –

+0

Спасибо, это именно то, что я искал. Хотя я изначально думал о том, как использовать FirstOrDefault с предикатом, я сейчас думаю, что использование OfType может поместиться лучше –

2

Альтернативой использованию OfType, который фактически перебирает весь список, вы можете использовать перегрузку FirstOrDefault и передать в предикате:

var firstAnimal = animals.FirstOrDefault(x => x is Animal) as Animal; 

Edit: как правильно отмечено @ Ли в комментариях, OfType не перебирает весь список; скорее, OfType будет выполнять только итерацию коллекции до тех пор, пока предикат FirstOrDefault не будет соответствовать.

+0

Не будет ли SingleOrDefault перебирать весь список, чтобы гарантировать, что существует не более одного элемент, который соответствует предикату? –

+0

Да - Мое плохо. Среднее значение FirstOrDefault. –

+3

'OfType' не перебирает весь список, он ленив так же, как' FirstOrDefault'. – Lee

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