关于IEnumerable
的简短问题:
IEnumerable
总是暗示一个集合吗?或者它是合法的/可行的/好的/在单个对象上使用什么?
答案 0 :(得分:5)
IEnumerable
和IEnumerable<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
表示项目的集合或可能的集合。
该名称源自枚举,表示:
答案 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放在其上。我想。