2012-02-28 86 views
3

我很好奇,如果這個程序可以用更優雅更清潔的方式實現嗎?類型轉換和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 2012-02-28 21:18:14

5

可以使用OfType<T>的類型檢查和鑄造(濾波FilmMedia類型的唯一元素),然後只計算基礎上,PlayTime屬性的總和:

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

出於某種原因,您的代碼中無法識別playtime。 – JavaCake 2012-02-28 21:14:24

+0

呵呵,這個修正確實有效。這種方法稱爲什麼? – JavaCake 2012-02-28 21:15:21

+0

應該基於您的原始代碼正常工作 - 您是否完全按照原樣使用它? – BrokenGlass 2012-02-28 21:15:26

4

非LINQ:

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

是的,這與原始代碼沒有多大區別,但我刪除了正在發生的雙重播放。 – 2012-02-28 21:13:31

+0

一個非常抽象的問題。但是,對於非LINQ方法是否有任何性能問題? – JavaCake 2012-02-28 21:17:22

+0

@JavaCake:除非這是您的應用程序的**非常**性能關鍵部分,否則無關緊要。這似乎不太可能。 – jason 2012-02-28 21:22:08