IEnumerable总是暗示一个集合吗?

时间:2011-09-22 01:47:44

标签: c# ienumerable

关于IEnumerable的简短问题:

IEnumerable总是暗示一个集合吗?或者它是合法的/可行的/好的/在单个对象上使用什么?

8 个答案:

答案 0 :(得分:5)

IEnumerableIEnumerable<T>接口建议某种序列,但该序列不需要是具体的集合。

例如,在这种情况下,底层具体集合在哪里?

foreach (int i in new EndlessRandomSequence().Take(5))
{
    Console.WriteLine(i);
}

// ...

public class EndlessRandomSequence : IEnumerable<int>
{
    public IEnumerator<int> GetEnumerator()
    {
        var rng = new Random();
        while (true) yield return rng.Next();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

答案 1 :(得分:2)

是的,IEnumerable表示项目的集合或可能的集合。

该名称源自枚举,表示:

  1. 逐一提及(很多事情)。
  2. 确定。的数量。

答案 2 :(得分:2)

单个对象始终强制使用IEnumerable - 单个对象始终是零个或多个其他对象的持有者或生产者与IEnumerable没有任何关系。

IEnumerable代表一个集合,通常但不是强制性的。

Enumerables可以是集合,也可以是生成器,查询甚至计算。

发电机:

IEnumerable<int> Generate(
    int initial,
    Func<int, bool> condition,
    Func<int, int> iterator)
{
    var i = initial;
    while (true)
    {
        yield return i;
        i = iterator(i);
        if (!condition(i))
        {
            yield break;
        }
    }
}

查询:

IEnumerable<Process> GetProcessesWhereNameContains(string text)
{
    // Could be web-service or database call too
    var processes = System.Diagnostics.Process.GetProcesses();
    foreach (var process in processes)
    {
        if (process.ProcessName.Contains(text))
        {
            yield return process;
        }
    }
}

计算:

IEnumerable<double> Average(IEnumerable<double> values)
{
    var sum = 0.0;
    var count = 0;
    foreach (var value in values)
    {
        sum += value;
        yield return sum/++count;
    }
}

LINQ本身就是一系列运算符,它们生成实现IEnumerable<T>但没有任何底层集合的对象。

好问题,BTW!

注意:对IEnumerable的任何引用也适用于IEnumerable<T>,因为后者继承了前者。

答案 3 :(得分:1)

According to the docs,它将枚举器暴露在集合中。

答案 4 :(得分:1)

你当然可以在单个对象上使用它,但是这个对象只是作为包含单个对象的枚举公开,即你可以拥有一个带有单个整数的IEnumerable<int>

IEnumerable<int> items = new[] { 42 };

答案 5 :(得分:1)

IEnumerable表示可以枚举的集合,而不是单个项目。看看MSDN;界面公开GetEnumerator(),其中

  

... [r] eturns一个遍历集合的枚举器。

答案 6 :(得分:1)

是的,IEnumerable总是暗示一个集合,这就是枚举的含义。

单个对象的用例是什么?

我没有看到在单个对象上使用它的问题,但为什么要这样做呢?

答案 7 :(得分:1)

我不确定你的意思是“收藏”还是.NET“ICollection”,但由于其他人只提到了前者,我会提到后者。

http://msdn.microsoft.com/en-us/library/92t2ye13.aspx

根据该定义,所有ICollections都是IEnumerable。但不是相反。 但是大多数数据结构(Array even)只是实现了两个接口。

继续这一思路:您可以拥有一个不暴露内部数据结构的汽车库(单个对象),并将IEnumerable放在其上。我想。