C# 参考类型参数和Linq

C# 参考类型参数和Linq,c#,linq,C#,Linq,我将列表作为参数传递给一个方法。Linq Where子句之后,列表值保持不变 void ChangeList(List<int> list) { list.Add(1); list.Add(2); list = list.Where(c => c > 1).ToList(); list.Add(3); // List values: 2, 3 } void Test()

我将列表作为参数传递给一个方法。Linq Where子句之后,列表值保持不变

    void ChangeList(List<int> list)
    {
        list.Add(1);
        list.Add(2);
        list = list.Where(c => c > 1).ToList();
        list.Add(3); // List values: 2, 3
    }

    void Test()
    {
        var list = new List<int>();

        list.Add(0);

        this.ChangeList(list);

        // List values: 0, 1, 2
    }
void变更列表(列表)
{
增加第(1)款;
增加(2);
list=list.Where(c=>c>1.ToList();
list.Add(3);//列表值:2,3
}
无效测试()
{
var list=新列表();
列表。添加(0);
本.变更清单(清单);
//列表值:0、1、2
}
可能,C#在Linq查询中的作用类似于函数编程

是什么导致了这种行为?为了避免任何意外的错误,我想知道到底是什么导致了这种情况


谢谢您的帮助和指导。

您这里的问题不是LINQ,而是列表参数是按值传递的,因此在您的外部代码中,您仍然有您传递的列表的修改副本,但不是由方法
ChangeList
中的
ToList
方法创建的新副本

要获取由ToList方法创建的新列表,必须以以下方式通过引用传递参数:

  void ChangeList(ref List<int> list)
无效变更列表(参考列表)

请记住,默认情况下,C#是按值传递的。
ToList
创建一个与原始列表无关的新列表:

引用类型的变量不直接包含其数据;信息技术 包含对其数据的引用。当传递引用类型时 参数的值,可以更改 引用,例如类成员的值。然而,你 无法更改引用本身的值;也就是说,你不能 使用相同的引用为一个新类分配内存,并将其保存 坚持在街区之外。为此,请使用 ref或out关键字

您有三种选择:

不要使用LINQ

void ChangeList(List<int> list)
{
    list.Add(1);
    list.Add(2);
    for(int i = list.Count - 1; i >= 0; i--)
        if(list[i] <= 1) list.RemoveAt(i);
    list.Add(3); // List values: 2, 3
}

ToList
创建一个与原始列表无关的新列表。不要使用LINQ,从方法返回列表或使用
ref list
List<int> GetList(List<int> list)
{
    list.Add(1);
    list.Add(2);
    for(int i = list.Count - 1; i >= 0; i--)
        if(list[i] <= 1) list.RemoveAt(i);
    list.Add(3); // List values: 2, 3
    return list;
}
// ...
list = GetList(list);
void ChangeList(ref List<int> list)
{
    list.Add(1);
    list.Add(2);
    list = list.Where(c => c > 1).ToList();
    list.Add(3); // List values: 2, 3
}
// ...
this.ChangeList(ref list);