不知道这是否是“最好”的方式(无论这意味着什么),但这至少起作用。如果您需要更多的LINQ语法,可以轻松扩展。
public static class Matrix
{
public static TResult[,] Select<T, TResult>(this T[,] source, Func<T, TResult> f)
{
var rows = source.GetLength(0);
var columns = source.GetLength(1);
var result = new TResult[rows, columns];
for (var row = 0; row < rows; row++)
{
for (var column = 0; column < columns; column++)
{
result[row, column] = f(source[row, column]);
}
}
return result;
}
}
使用以下(相当缺乏光泽)xunit实际测试,随意指出错误。
[Fact]
public void MatrixSelect_GivenFunction_MapsMatrix()
{
var matrix = new[,]
{
{true, true},
{false, true}
};
var transformed =
from cell in matrix
select cell ? 1 : 0;
var expected = new[,]
{
{1, 1},
{0, 1}
};
Assert.Equal(expected, transformed);
}
来源
2016-07-19 16:18:10
kai
写一堆自定义的LINQ扩展看起来是最简单和最干净的路径。这种繁琐的编写和维护这种样板代码,但哦。 – kai