List <string>和IEnumerable <string> </string> </string>的区别是什么

时间:2012-05-09 19:52:35

标签: c#

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

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);
}

5 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:1)

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

IEnumerable<T>接口List<T>是实现此接口的实际类。

答案 2 :(得分:0)

您的示例实际上是将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);
}

答案 3 :(得分:0)

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

使用一个优于另一个有一种“优势”。

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

List实现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);

答案 4 :(得分:0)

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

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