C# 列表中的区别是什么<;字符串>;和IEnumerable<;字符串>;

C# 列表中的区别是什么<;字符串>;和IEnumerable<;字符串>;,c#,C#,这两个人似乎在做同样的事情。我给它们计时——知道这是一个小例子——但它们似乎也以完全相同的速度运行。使用一个比另一个有好处吗 List<string> alpha = new List<string>(new string[] { "a", "b", "c" }); foreach (var letter in alpha) { Console.WriteLine(letter); } IEnumerable<string> _alpha = new

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

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);
}
List alpha=新列表(新字符串[]{“a”、“b”、“c”});
foreach(阿尔法中的var字母)
{
控制台。书写线(字母);
}
IEnumerable _alpha=新[]{“a”、“b”、“c”};
foreach(字母为α的变量)
{
控制台写入线(_字母);
}
IEnumerable
是一个接口<代码>列表是实现该接口的类

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

该类负责实际实现该功能


您的测试实际上是测试遍历
列表
字符串[]
的速度。由于样本的大小很小,而且
列表的内部工作方式也很简单,所以您应该看不出有什么区别。

对于您的示例,在执行速度和最终结果方面(特别是只有三项)没有什么实质性的区别


IEnumerable
是一个接口,
List
是实现此接口的实际类。

您的示例实际上是将
List
string[]
进行比较。这两种类型都实现了
IEnumerable
,它只是一个指定类型行为的接口

关于类型本身,主要区别在于
List
可以根据需要调整大小(在大多数情况下没有固定的长度),而
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);
}
IEnumerable alpha=新列表(新字符串[]{“a”、“b”、“c”});
foreach(阿尔法中的var字母)
{
控制台。书写线(字母);
}
IEnumerable _alpha=新[]{“a”、“b”、“c”};
foreach(字母为α的变量)
{
控制台写入线(_字母);
}

它们是不同类型的对象,
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);
}
而这些并不是:

OutputList(stringCol);
OutputList(stringEn);
列表
是元素集合的具体实现,该集合具有多种方法,如
添加
删除
排序
,等等。它将所有元素都存储在内存中,可以通过索引器随机访问它们


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

@jorgehmv List不是一个接口,它是一个具体的类。在第二个示例中,您实际上创建了一个数组。因为
IEnumerable
是一个接口,所以不能创建这种类型的对象。NET中的数组只是实现了
IEnumerable
接口。
List
“List
IEnumerable
之间有什么不同?”?那么,尝试向类型为
IEnumerable
的变量添加一个新项。不能,因为
IEnumerable
表示枚举类内容的能力
List
就是这样一个类,但它也可以做其他事情(比如添加和删除项)。第二个示例创建一个数组,而第一个示例创建一个列表和一个数组。如果编译为发行版,则可能会进行优化,否则第二个可能会更快(如果执行多次)@OskarKjellin-最好是一个微优化。“可能”是应该通过测量来备份的东西。如果编译器不够聪明,无法优化临时数组的创建,那么我放弃…好的,第一个需要374毫秒,第二个需要240毫秒,在发布模式下执行1000次。所以第一个比我想象的要慢guessed@OskarKjellin-平均执行多少次?如果在
列表
之前反转迭代(
IEnumerable
),结果会是什么?实际上,我认为没有区别,因为
List
在封面后面使用数组。@Tudor-因此对类的内部工作进行了注释。
OutputEnumerable(stringList);
OutputEnumerable(stringCol);
OutputEnumerable(stringEn);
OutputList(stringList);
OutputList(stringCol);
OutputList(stringEn);