5

这两个人似乎在做确切的事情。我给它们计时——知道这是一个小例子——但它们似乎也以完全相同的速度运行。使用一个比另一个有好处吗?

List<string> alpha = new List<string>(new string[] { "a", "b", "c" });
foreach (var letter in alpha)
{
    Console.WriteLine(letter);
}

IEnumerable<string> _alpha = new[] {"a", "b", "c"};
foreach(var _letter in _alpha)
{
     Console.WriteLine(_letter);
}
4

5 回答 5

4

IEnumerable<string>是一个接口。List<string>是实现该接口的类。

接口只是定义实现该接口的类必须实现的功能。

该类负责实际实现该功能。

您的测试实际上是在测试迭代 aList<string>和 a的速度string[]。由于样本的小尺寸和List<string>类的内部运作,你真的不应该看到差异。

于 2012-05-09T19:53:48.623 回答
1

您的示例确实List<string>string[]. 这两种类型都实现IEnumerable<string>了,它只是一个指定类型行为的接口。

关于类型本身,主要区别在于List<string>可以根据需要调整大小(并且对于大多数目的没有固定长度),而string[]必须在创建时指定其长度并且不能调整大小。每个人的表现都应该是事后的想法。

您的示例也可以这样写,含义完全相同:

IEnumerable<string> alpha = new List<string>(new string[] { "a", "b", "c" });
foreach (var letter in alpha)
{
    Console.WriteLine(letter);
}

IEnumerable<string> _alpha = new[] {"a", "b", "c"};
foreach(var _letter in _alpha)
{
    Console.WriteLine(_letter);
}
于 2012-05-09T19:55:58.573 回答
1

它们是不同类型的对象,IEnumerable是接口(不是实例本身,只是某些功能的模式),List而是实际类。

使用其中一个有一种“优势”。

如果您正在编写一个想要更灵活的方法,并且只需要枚举对象,那么使用IEnumerable.

Listimplements IEnumerable,并且可以被视为,就像Collection,和许多其他类一样。

以此为例:

public void OutputEnumerable(IEnumerable<string> strings)
{
    foreach (string s in strings)
        Console.WriteLine(s);
}

public void OutputList(List<string> strings)
{
    foreach (string s in strings)
        Console.WriteLine(s);
}

然后你有这个数据:

List<string> stringList = new List<string>(new [] { "a", "b", "c" });
Collection<string> stringCol = new Collection<string>(new [] { "a", "b", "c" });
IEnumerable<string> stringEn = new [] { "a", "b", "c" };

这些都有效:

OutputEnumerable(stringList);
OutputEnumerable(stringCol);
OutputEnumerable(stringEn);
OutputList(stringList);

而这些不会:

OutputList(stringCol);
OutputList(stringEn);
于 2012-05-09T19:56:12.910 回答
1

List<string>是元素集合的具体实现,它具有各种方法,例如AddRemoveSort等。它的所有元素都已经在内存中,并且可以通过索引器随机访问它们。

IEnumerable<string>是一个接口,定义了可以使用for循环或GetEnumerator()方法枚举的字符串序列。它不包含对其元素(如列表)进行操作的其他方法。此外,这些元素可能不会存储在内存中,而是一次来自某个来源。

于 2012-05-09T19:59:30.963 回答
1

关于您的示例,就执行速度和最终结果(特别是只有三个项目)而言,没有真正的区别。

IEnumerable<T>是一个接口List<T>是一个实现这个接口的实际类。

于 2012-05-09T19:53:57.747 回答