C# 参考类型参数和Linq
我将列表作为参数传递给一个方法。Linq Where子句之后,列表值保持不变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()
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);