为什么 Linq Prepend() 不适用于 List<T>?

Thế*_*ong 5 .net c# linq

问题是我试图将一个对象添加到列表中,但碰巧该对象根本没有添加到列表中。我的代码如下所示:

List<string> names = GetNames();
string defaultName = "default";
if (!names.Contains(defaultName))
    names.Prepend(defaultName);
Run Code Online (Sandbox Code Playgroud)

有趣的是,当我调试代码时,执行了 Prepend() 指令,但什么也没发生。因此,我必须使用 List.Insert() 来完成任务,但我不明白这里发生了什么?

我的名字列表只是一个包含 4 个名字的简单列表,没什么特别的,如果有帮助的话,我使用的是 Visual Studio 2017 和 .Net Framework 4.7。

Ous*_* D. 8

正如评论下的人所提到的,已经Prepend没有修改源代码,同样适用于类中的所有扩展方法Enumerable

另外,在文档中提到

此方法不会修改集合的元素。相反,它使用新元素创建集合的副本。

解决方案是存储返回的值Prepend而不是丢弃它。

此外,如果您想找到一个实际修改源的方法,则使用Insert其他方法,您也可以创建自己的Prepend扩展方法:

static class Extentions
{
    public static void Prepend<T>(this List<T> source, T element) => source.Insert(0, element);
}
Run Code Online (Sandbox Code Playgroud)

您将使用与当前使用 完全相同的方式来使用此方法Enumerable.Prepend,但是您必须确保您的代码实际上调用的是此版本Prepend而不是Enumerable类中的版本。

如果认为合适,您可以通过简单地重命名Prepend为来完全消除混淆PrependToList