我试图将int类型列表中的所有数字对齐。但是,当我运行代码时,列表似乎根本不会被更改。
public static List<int> SquareList(List<int> root)
{
root.ForEach(x => x = x*x);
return root;
}
x_unit中的测试类。
[Fact]
public void testSqures()
{
var input = new List<int> { 1, 2, 3 };
var expected = new List<int> { 1, 4, 9 };
var result = Square.SquareList(input);
Assert.Equal(expected,result);
}
问题foreach
运算符不会更改基础对象吗?
我是否需要创建新列表?或者有没有办法改变名单?
答案 0 :(得分:1)
将其更改为
return root.Select(x => x*x).ToList();
这不会改变现有列表,它会创建一个新列表并返回它,这将是首选。如果您确实要更新原始列表,请更改签名以传递ref
,然后将指针更新为新列表。
public static List<int> SquareList(ref List<int> root)
{
root = root.Select(x => x*x).ToList();
return root;
}
或将其与for循环一起使用
public static List<int> SquareList(List<int> root)
{
for(int i = 0; i < root.Count; i++)
root[i] = root[i]*root[i];
return root;
}
ForEach
会对列表进行迭代,如果你有一个包含int
的引用类型(类),你可以更改该类型中的值但是你不能重新分配列表中包含的指针
答案 1 :(得分:0)
如果要获取新的集合表示,请使用Select而不是ForEach。返回新对象而不是更改它是函数式编程的范例。 LINQ有助于使用这种范例。
答案 2 :(得分:0)
来自MSDN:
不支持修改Action委托主体中的基础集合,并导致未定义的行为。
你应该使用常规的for
循环来做这些事情,而不是LINQ或类似的功能声明
public static List<int> SquareList(List<int> root)
{
for (int i = 0, n = root.Count; i < n; ++i)
root[i] = root[i] * root[i];
return root;
}