我个人的编码风格属于Enumerable.OfType<T>()
。我在所有有意义的地方都使用它。特别是IEnumerable<T>
允许强大的linqToObject功能。我讨厌ObjectCollections的“类型不安全”循环,例如下面的示例。现在,我有一些关于遍历这些“UnGenericCollections”的问题。
ConfigurationSectionCollection
HttpModuleCollection
SPBaseCollection
SPFieldCollection
ArrayList
问题1:如果我将此
ArrayList
转换为Enumerable<T>
,则与简单的foreach/if-check相比,附加循环的大小是多少?var ark = new ArrayList();
ark.Add(new Human());
ark.Add(new Human());
ark.Add(new Animal());
代替:
foreach (object passenger in ark)
{
if (passanger is Human) { }
if (passanger is Animal) { }
}
我用:
foreach (var human in ark.OfType<Human>())
{
}
foreach (var animal in ark.OfType<Animal>())
{
}
问题2:在foreach循环中,到不同类型的变量中,将使用哪种转换/转换方式?这是语言功能还是开箱即用?
foreach (Human human in ark) { }
感谢您忍受糟糕的英语。最好的问候,本杰明
最佳答案
回答1:
在您的示例中-您实际上可能对FULL枚举进行了两次迭代。
// i use
foreach (var human in ark.OfType<Human>())
{
}
foreach (var animal in ark.OfType<Animal>())
{
}
回答2:
如果方舟中有任何非人类,它将抛出InvalidCastException异常。
我个人更喜欢
ark.OfTypes<T>()
,以防万一我只想处理Human
和Animals
,但会忽略Elves
。这样,代码就更加简洁了,您正在处理foreach循环中的强类型对象。但是如果我不想忽略
Elves
,我还是要遍历整个ArrayList并使用强制转换。关于C#,objectCollection.OfType <T>()和foreach(objectCollection中的T项),从IEnumerable到IEnumerable <T>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6063471/