我个人的编码风格属于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>(),以防万一我只想处理HumanAnimals,但会忽略Elves。这样,代码就更加简洁了,您正在处理foreach循环中的强类型对象。

    但是如果我不想忽略Elves,我还是要遍历整个ArrayList并使用强制转换。

    关于C#,objectCollection.OfType <T>()和foreach(objectCollection中的T项),从IEnumerable到IEnumerable <T>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6063471/

    10-12 12:36
    查看更多