c# - 在 C# 中的 Array.Select 之后连接的问题

我正在为一个 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是自定义类型Ronders.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;
}

相似文章

php - 挣扎于数组 php 中的索引

从rapidapi获取json数据并尝试将其放入canvasjs图表中。我相信为什么我的图表不打印的问题是因为我创建的数组没有正确的索引。我的数组在所需的每个元素上都有索引0,它的索引为0-13。<!...

pinescript-v5 - Pinescript 循环警报

设置警报时,我正在运行一个循环以循环浏览40项资产的列表,但警报似乎只针对满足条件的第一项资产触发,而不会检查其余资产。我附上了下面的脚本//@version=5indicator(title='sc...

随机推荐

最新文章