C#,objectCollection.OfType <T>()和foreach(objectCollection中的T项),IEnumerable到IEnumerable <T>

ben*_*asd 6 c# ienumerable foreach linq-to-objects generic-list

以我个人的编码风格所属Enumerable.OfType<T>().我在任何地方使用它都有点意义.特别是IEnumerable<T>允许强大的linqToObject功能.我讨厌ObjectCollections的"类型不安全"循环,例如下面的示例.现在我有一些关于循环这些"UnGenericCollections"的问题.

问题1:如果我将此转换ArrayListEnumerable<T>与简单的foreach/if-checks相比有多大的额外循环?

var ark = new ArrayList();
ark.Add(new Human());
ark.Add(new Human());
ark.Add(new Animal());
Run Code Online (Sandbox Code Playgroud)

代替:

foreach (object passenger in ark)
{
    if (passanger is Human) { }
    if (passanger is Animal) { }
}
Run Code Online (Sandbox Code Playgroud)

我用:

foreach (var human in ark.OfType<Human>())
{
}

foreach (var animal in ark.OfType<Animal>())
{
}
Run Code Online (Sandbox Code Playgroud)

问题2:在foreach循环中使用不同类型的变量时,将使用哪种投射/转换方式?这是一种语言功能还是开箱即用?

foreach (Human human in ark) { }
Run Code Online (Sandbox Code Playgroud)

谢谢你忍受我可怕的英语.最好的问候,本杰明

Yet*_*ser 4

答1:

在您的示例中 - 您实际上可能会迭代FULL枚举两次。

// i use
foreach (var human in ark.OfType<Human>())
{
}

foreach (var animal in ark.OfType<Animal>())
{
}
Run Code Online (Sandbox Code Playgroud)

答2:

如果方舟中存在非人类,则会抛出 InvalidCastException 异常。

我个人更愿意ark.OfTypes<T>(),万一我知道我只想处理HumanAnimals会被忽略Elves。这样代码更加简洁,并且您在 foreach 循环中处理强类型对象。

但同样,如果我不想忽略Elves,我宁愿迭代完整的 ArrayList 并使用强制转换。