2012-02-28 4 views
3

Мне было любопытно, может ли эта процедура делать, если вы сделаете это более элегантным и чистым способом?Typecasting and foreach

 foreach (MediaTitle item in mediaTitleCollection) 
     { 
      if (item is FilmMedia) 
      { 
       FilmMedia tempItem = (FilmMedia) item; 
       sum += tempItem.Playtime; 
      } 
     } 

Заранее спасибо.

ответ

14
var sum = mediaTitleCollection.OfType<FilmMedia>().Sum(x => x.Playtime); 
+1

Мне нравится, что этот ответ пропускает ненужное преобразование выбора. – asawyer

5

Вы можете использовать OfType<T> для проверки типа и литой (фильтрации на только элементы типа FilmMedia), а затем просто вычислить сумму на основе PlayTime собственности:

sum = mediaTitleCollection.OfType<FilmMedia>() 
          .Select(x=> x.Playtime) 
          .Sum(); 
+0

По какой-то причине время воспроизведения не распознается в коде. – JavaCake

+0

О, коррекция сделала трюк. Как называется этот метод? – JavaCake

+0

должен работать нормально, основываясь на вашем исходном коде - используете ли вы его как есть? – BrokenGlass

4

Non-LINQ:

foreach (MediaTitle item in mediaTitleCollection) 
    { 
     FilmMedia tempItem = item as FilmMedia; 
     if (tempItem != null) 
     { 
      sum += tempItem.Playtime; 
     } 
    } 
+0

Да, это не сильно отличается от исходного кода, но я удалил двойное нажатие, которое происходило. –

+0

Очень абстрактный вопрос. Но есть ли проблемы с производительностью для метода Non-LINQ? – JavaCake

+0

@JavaCake: Не имеет значения, если это не является чрезвычайно критическим для вашего приложения. Это кажется маловероятным. – jason