这两个似乎正在做的事情。我把它们计时 - 知道这是一个小例子 - 但它们似乎也以完全相同的速度运行。使用一个比另一个好吗?
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);
}
答案 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>
是元素集合的具体实现,它具有各种方法,例如Add
,Remove
,Sort
等。它具有已在内存中的所有元素并可以通过索引器随机访问它们。
IEnumerable<string>
是定义可以使用for
循环或GetEnumerator()
方法枚举的字符串序列的接口。它不包含对其元素(如列表)进行操作的其他方法。此外,元素可能不会存储在内存中,而是一次来自某个源。