我正在为一个 uni 项目编写以下代码:
public Order[] collapse()
{
return ConcatArrays(Rondes.Select(rs => rs.collapse()));
}
public static T[] ConcatArrays<T>(T[][] list)
{
var result = new T[list.Sum(a => a.Length)];
int offset = 0;
for (int x = 0; x < list.Length; x++)
{
list[x].CopyTo(result, offset);
offset += list[x].Length;
}
return result;
}
这里rs
是自定义类型Ronde
,rs.collapse()
返回Order[]
。第一个 function 的目标是为每个 rs
计算 rs.collapse()
,并连接这些数组。我该如何解决以下错误:
The type arguments for method ConcatArrays<T>(T[][]) cannot be inferred from the usage. Try specifying the type arguments explicitly.
我试图通过将所有 T
更改为 Order
来遵循建议,但这并没有改变错误消息。任何帮助是极大的赞赏!!提前致谢!
编辑:我现在将第一个 function 更改为:
public Order[] collapse()
{
if (Rondes == null) { return new Order[0]; }
return OrderLijsten.ConcatArrays<Order>(Rondes.Select(rs => rs.collapse()));
}
但现在我得到这个错误:
Error CS1503 Argument 1: cannot convert from 'System.Collections.Generic.IEnumerable<Grote_Opdracht.Classes.Order[]>' to 'Grote_Opdracht.Classes.Order[][]'
回答1
错误消息给你一个非常清楚的解释:你的 Select
调用返回一个 IEnumerable
但这个 ConcatArrays 实现需要一个数组(数组)。
您可以使该方法使用 IEnumerable
(但随后您会枚举多次),或者调用 ToArray
来创建一个数组。在这种情况下,我更喜欢组合,也使用 ToList
代替,这应该是性能最高的选项:
public Order[] Collapse()
{
// make sure to iterate only once
var arrays = Rondes.Select(rs => rs.collapse()).ToList();
return ConcatArrays(arrays);
}
// use IEnumerable to be more flexible
public static T[] ConcatArrays<T>(IEnumerable<T[]> arrays)
{
var result = new T[arrays.Sum(a => a.Length)];
int offset = 0;
foreach (var a in arrays)
{
a.CopyTo(result, offset);
offset += a.Length;
}
return result;
}