使用Linq和ForEach编辑2D数组

时间:2014-12-17 19:51:50

标签: c# arrays linq

我正试图以Linqified方式解决this question

“在2D数组中查找对角线并在其上方替换0”

这是我的Linqfied解决方案:

Random r = new Random();
        //int[,] mas = new int[4, 5];

        int[][] mas = new int[4][];


        for (int i = 0; i < mas.Length; i++)
        {
            mas[i] = new int[5];

            for (int j = 0; j < mas[i].Length; j++)
            {
                mas[i][j] = r.Next(1, 10);
                Console.Write("{0}\t", mas[i][j]);
            }

            Console.WriteLine();
        }

        // my code starts here
        for (int i = 0; i < mas.Length; i++)
        {
            mas[i] = mas[i].Select((c, ind) =>
            {
                if (ind > i)
                    c = 0;

                return c;

            }).ToArray();
        }

它有效,但我想摆脱for循环,然后我做了:

 mas.ToList().ForEach(m0 =>
            {
                m0 = m0.Select((c, ind) =>
                {
                    if (ind > k)
                        c = 0;

                    return c;

                }).ToArray();

                k++;
            });

尽管内部元素m0在调试时将所需值更改为零,但mas 2D数组不会更改其值。

2 个答案:

答案 0 :(得分:0)

您可以像这样使用linq:

mas = mas
    .Select((a, i) => a.Select((c, j) => j > i ? 0 : c).ToArray())
    .ToArray();

答案 1 :(得分:0)

您正在将参数更改为方法,该方法是数组中值的副本。改变该副本不会改变原始数组。

基于LINQ的正确解决方案是使用LINQ操作,以便执行查询的结果是您的数据集,而不是让查询的执行改变其他一些数据集:

var random = new Random();
var query = Enumerable.Range(0, 4)
    .Select(i => Enumerable.Range(0, 5)
        .Select(j => j > i ? 0 : random.Next(1, 10))
        .ToArray())
    .ToArray();