为什么Linq Prepend()无法与List <t>一起使用?

时间:2018-12-25 09:52:01

标签: c# .net linq

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

List<string> names = GetNames();
string defaultName = "default";
if (!names.Contains(defaultName))
    names.Prepend(defaultName);

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

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

1 个答案:

答案 0 :(得分:1)

正如伙计们在评论中所述,Prepend不会修改源代码,并且同样适用于Enumerable类中的所有扩展方法。

Also, mentioned in the docs

  

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

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

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

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

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

如果认为适当,只需将Enumerable重命名为Prepend,就可以完全消除混乱。