我正试图以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数组不会更改其值。
答案 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();