ben*_*asd 6 c# ienumerable foreach linq-to-objects generic-list
以我个人的编码风格所属Enumerable.OfType<T>().我在任何地方使用它都有点意义.特别是IEnumerable<T>允许强大的linqToObject功能.我讨厌ObjectCollections的"类型不安全"循环,例如下面的示例.现在我有一些关于循环这些"UnGenericCollections"的问题.
ConfigurationSectionCollectionHttpModuleCollectionSPBaseCollectionSPFieldCollectionArrayList问题1:如果我将此转换ArrayList为Enumerable<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)
谢谢你忍受我可怕的英语.最好的问候,本杰明
答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>(),万一我知道我只想处理Human但Animals会被忽略Elves。这样代码更加简洁,并且您在 foreach 循环中处理强类型对象。
但同样,如果我不想忽略Elves,我宁愿迭代完整的 ArrayList 并使用强制转换。