无法在linq语句

时间:2017-03-18 11:27:10

标签: c# linq

我试图将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运算符不会更改基础对象吗?

我是否需要创建新列表?或者有没有办法改变名单?

3 个答案:

答案 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;
}