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;
}
}