代码之家  ›  专栏  ›  技术社区  ›  Cheng Chen

为什么IEnumerable<t>不实现添加(t)?

  •  12
  • Cheng Chen  · 技术社区  · 14 年前

    刚才偶然发现,在 ICollection<T> 而不是 IEnumerable<T> . Enumerable.cs中的扩展方法不包含add(t),我认为这很奇怪。由于对象是可枚举的,因此它必须“看起来”是一组项。有人能告诉我为什么吗?

    6 回复  |  直到 13 年前
        1
  •  48
  •   Steven    13 年前

    IEnumerable<T> 只是一系列元素;将其视为仅向前的光标。因为这些序列中有很多都是从数据库生成值、数据流或记录集,所以 Add 项目给他们。

        2
  •  11
  •   peSHIr    14 年前

    IEnumerable 是为了阅读,不是为了写作。

        3
  •  10
  •   Andras Zoltan    14 年前

    一个可枚举的就是这个——你可以枚举并发现所有的项。这并不意味着你可以加进去。

    能够枚举对于许多类型的对象是通用的。例如,它由数组和集合共享。但是你不能在不影响数组结构的情况下“添加”到数组中,而集合是专门为添加和删除而构建的。

    不过,从技术上讲,您可以使用 Concat<> -然而,所有这一切都是创建一个枚举器,从一个可枚举到下一个可枚举-给人一个单一的挫伤集的错觉。

        4
  •  3
  •   peSHIr    14 年前

    ICollection 应该是 IEnumerable (我认为,.NET框架团队似乎同意我的观点;-),但反过来并不总是有意义的。在这个世界上有一个“类似集合的对象”的层次结构,并且您假设一个可枚举的集合就是您可以向其添加项的集合,在这个层次结构中不成立。

    示例:主颜色名称列表将是 可枚举的 返回 "Red" , "Blue" "Green" . 如果能做到 primaryColors.Add("Bright Purple") 在这样填写的“收藏集”上:

    ...whatever...
    {
        ...
        var primaryColors = EnumeratePrimaryColors();
        ...
    }
    
    private static IEnumerable<string> EnumeratePrimaryColors() {
        yield return "Red";
        yield return "Blue";
        yield return "Green";
    }
    
        5
  •  2
  •   Frederik Gheysels    14 年前

    正如它的名字所说,您可以枚举(循环)一个IEnumerable,这就是它。 当你想要添加一些东西到它上面时,它就不再是一个可枚举的了,因为它有额外的特性。

    例如,数组是IEnumerable,但数组的长度是固定的,因此不能向其中添加新项。

    IEnumerable只是所有类型集合(甚至是只读集合——显然没有add()方法)的“基”。 你添加到这种“基本接口”中的功能越多,它就越具体。

        6
  •  2
  •   Atanas Korchev    14 年前

    名字说明一切。IEnumerable仅用于枚举项。ICollection是项的实际集合,因此支持Add方法。