当列表已经可迭代时,为什么我需要将列表转换为 IEnumerable?

Why do I need to convert a list to IEnumerable when the list is already iterable?

我了解 IEnumerable 和 IEnumerator 之间的区别。但是我不太想什么时候应该将我的列表转换为 IEnumerable。列表不是已经可以迭代了吗?一些教程显示了每个示例来解释 IEnumerable。但是列表不是也以与 IEnumerable 完全相同的方式工作吗?请告诉我!谢谢!

大多数时候您不需要将 List 转换为 IEnumerable。我假设您正在谈论一个将 IEnumerable 类型指定为参数的方法签名,它只是该方法接受实现该接口的任何集合的一种方式,而不是为每种类型的集合显式声明覆盖.

一个List<T> 一个IEnumerable<T>。数组也是如此,许多其他 类 也是如此。当我们说它是一个 IEnumerable<T> 时,我们的意思是它实现了那个接口。

所以如果我有这个方法:

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

这些都行。您无需转换任何内容。

var stringArray = new string[] {"a", "b", "c"};
PrintStringsToConsole(stringArray);

var stringList = new List<string> {"x", "y", "z"};
PrintStringsToConsole(stringList);

var hashSet = new HashSet<string> {"a","b","c"};
PrintStringsToConsole(hashSet);

var filteredList = stringList.Where(s => s != "a"); 
PrintStringsToConsole(filteredList);