C# 铸字与foreach

C# 铸字与foreach,c#,C#,我很好奇我所做的这个程序是否能以一种更优雅、更干净的方式归档 foreach (MediaTitle item in mediaTitleCollection) { if (item is FilmMedia) { FilmMedia tempItem = (FilmMedia) item; sum += tempItem.Playtime;

我很好奇我所做的这个程序是否能以一种更优雅、更干净的方式归档

        foreach (MediaTitle item in mediaTitleCollection)
        {
            if (item is FilmMedia)
            {
                FilmMedia tempItem = (FilmMedia) item;
                sum += tempItem.Playtime;
            }
        }
提前感谢。

您可以使用进行类型检查和播放(仅过滤到类型为
FilmMedia
的元素),然后根据
播放时间属性计算总和:

sum = mediaTitleCollection.OfType<FilmMedia>()
                          .Select(x=> x.Playtime)
                          .Sum();
sum=mediaTitleCollection.OfType()
.选择(x=>x.Playtime)
.Sum();
var sum=mediaTitleCollection.OfType().sum(x=>x.Playtime);
非LINQ:

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

是的,这与原始代码没有太大区别,但我删除了正在发生的双重转换。一个非常抽象的问题。但是,对于非LINQ方法,是否存在任何性能问题?@JavaCake:没有任何问题,除非这是应用程序中非常关键的性能部分。这似乎不太可能。两者之间的性能差异即使可以测量,也应该可以忽略不计。如果您有.NET3.5或更高版本可供使用,一定要使用LINQ解决方案之一。仅仅可读性是值得的。杰森的答案得到了我的投票,正是因为这个原因。我也和杰森一起去!它非常简洁。基于您的原始代码,应该可以正常工作-您是否完全按照原样使用它?
Aggregate()
将始终有效,但大多数语法过于笼统,我尽量避免这样做-在这种情况下更好的选择是@Jason的解决方案,通过属性直接计算总和-我不想更新我的答案,因为他是第一个这样做的。我喜欢这个答案跳过不必要的选择转换。
    foreach (MediaTitle item in mediaTitleCollection)
    {
        FilmMedia tempItem = item as FilmMedia;
        if (tempItem != null)
        {
            sum += tempItem.Playtime;
        }
    }