是的,我确实知道锯齿状数组[] []和多维数组[,]之间的区别。
是的,我已经找了重复项并找到了这些:
其中最后一个包含完成工作的功能。但我的问题仍然是:是否有任何方法(无论多么扭曲或设计)说服LINQ构造并以多维数组的形式返回结果(并且不一个锯齿状数组)? / p>
这与这个问题并不真正相关,但是这里导致的问题之一就是那些看起来像是“为LINQ制作”的小工作,除了我需要调用的函数是用多维数组参数定义的。作为锯齿状数组产生答案的LINQ代码花了大约5分钟来编写,然后是什么?我错过了什么,或者LINQ是否真的无法来完成这项工作?
我想我应该说:除了编写一大块代码以旧的方式执行它并将其作为lambda嵌入或将其称为扩展方法。现在它看起来好像LINQ既不能生成也不消耗多维数组,我的问题的答案是否定的。
答案 0 :(得分:5)
void Main()
{
var wat = new[]{2, 4, 5, 6, 7, 8}
.Select(x => new { dummy=1, val= x})
.GroupBy(x => x.dummy) // group everything into one, "UNFLATTEN"
.Select(gr =>
{
var elements = gr.Select(x => x.val).ToList();
if(elements.Count == 0 || elements.Count % 2 != 0)
throw new NotSupportedException("I don't know what to do.");
var halfSize = elements.Count / 2;
int[,] ret = new int[2, halfSize];
for(var k = 0; k < halfSize; k++){
ret[0, k] = elements[k];
ret[1, k] = elements[elements.Count - halfSize + k];
}
return ret;
}
).First();
wat.Dump();
}
输出:
_ 0 1 2
0 2 4 5
1 6 7 8
正如其他人所说,通过创建新的扩展方法,您最好:
static class LinqExtensions
{
public static T[,] ToRectangularArray<T>(this IEnumerable<IEnumerable<T>> arrays)
{
// TODO: Validation and special-casing for arrays.Count == 0
// TODO: Rename "arrays"
// TODO: Make sure that Count() is used only once,
// TODO: ElementAt() does not work everywhere, you're better off using ToList() before!
int minorLength = arrays.First().Count();
T[,] ret = new T[arrays.Count(), minorLength];
for (int i = 0; i < arrays.Count(); i++)
{
var array = arrays.ElementAt(i);
if (array.Count() != minorLength)
{
throw new ArgumentException
("All arrays must be the same length");
}
for (int j = 0; j < minorLength; j++)
{
ret[i, j] = array.ElementAt(j);
}
}
return ret;
}
}
void Main()
{
var wat = new[]{new[]{2, 4, 5}, new[]{6, 7, 8}}.ToRectangularArray();
wat.Dump();
}
为了便于您,您可能希望为IEnumerable<T>
添加相同的扩展方法,并将其称为:ToRectangularArray<T>(this IEnumerable<T> input, int dimensions = 2)
答案 1 :(得分:0)
我想我应该说:除了编写一大堆代码之外 旧方法并将其嵌入为lambda或将其称为扩展 方法。现在它看起来好像LINQ既不能产生也不能产生 使用多维数组,我的问题的答案是否定的。
不是。大多数LINQ方法都是IEnumerable<T>
的扩展方法。虽然锯齿状数组(比如int[int[]]
)实现IEnumerable<int[]>
,但多维数组不会实现IEnumerable<T>
,因此您无法使用任何LINQ扩展方法。
你唯一能做的就是最终使用投影(Select
)返回一个多维数组。