C#中的ToArray()方法与固定数组大小

3
我在C#中有一个2D矩阵,构建起来有点复杂。以下是该矩阵生成的代码:
    string[][] learningInputNotCodified = learningDataRaw.Select(ldr => new string[] {
            ldr.ChangeType.ToString(),
            ldr.MutationOperator.Name??"null",
            ldr.MutationOperator.Before??"null",
            ldr.MutationOperator.After??"null",
            ldr.SLOC.ToString(),
            dBContext.TestCases
                .Count(tc => tc.UserMutantPlay.MutantId == ldr.Id).ToString(),
            dBContext.TestCases
                .Where(tc => tc.UserMutantPlay.MutantId == ldr.Id)
                .Select(rtc => new {
                    killCount = dBContext.TestCases
                        .Where(tc => tc.IsMutantKilled
                        && tc.UserMutantPlay.MutantId == ldr.Id
                        && !tc.InputValues.Any(iv =>
                        rtc.InputValues.FirstOrDefault(iv1 => iv1.InputParameterId == iv.InputParameterId).ValueAsString != iv.ValueAsString))
                        .Count()
                }).Sum(tc => tc.killCount).ToString(),
            ldr.OriginalCode.Mutants.Count().ToString(),
            ldr.ASTDiff??"null"
        }.Concat(
            ldr.ParseSubTrees.OrderBy(pst => pst.Height).Select(pst => pst.SerializedTree).ToArray()
            ).ToArray()).ToArray();

不用担心上面的代码。问题是我想让矩阵成为正方形。硬编码的列没问题,但来自数据库ldr.ParseSubTrees.OrderBy(pst => pst.Height).Select(pst => pst.SerializedTree).ToArray()的那些列会出问题。在到达这个语句(大语句)之前,我已经查询了数据库的最大大小。因此,我知道大小,只需要像这样:
ldr.ParseSubTrees.OrderBy(pst => pst.Height).Select(pst => pst.SerializedTree).ToArray(maxParseTreeDepth)

虽然这只是我所需要的东西的示例而不是解决方案,但我需要以如下形式定义数组大小。
在你建议解决方案之前,我必须指出 Array.Resize 无法帮助。因为它需要一个保存的对象作为 ref,而在选择表达式中我做不到。
2个回答

2

一种快速而简单的解决方案是将数组连接起来,然后使用Take()

查询之前:

var paddingArray = new string[maxParseTreeDepth];

查询内部:

ldr.ParseSubTrees
    .OrderBy(pst => pst.Height)
    .Select(pst => pst.SerializedTree)
    .Concat(paddingArray)
    .Take(maxParseTreeDepth)
    .ToArray();

是的,这确实很糟糕。这将创建三到四次数组!我把这个方法放在最后。还有其他想法吗??? - ConductedClever
如果您担心多次创建数组,您可以始终先创建数组,然后在Concat内使用该实例。 - Federico Dipuma
1
@ConductedClever “这将创建三到四个数组!” 你为什么这么说?在循环中只会创建一个数组 - 当您调用 ToArray 时生成的那个数组。 - D Stanley
我完全不会认为这是肮脏的。你需要填充那些大小不足的数组,而这一点你做得相当出色。 - D Stanley
是的,我认为你是对的。还不够确定!但是我现在可以接受它。 - ConductedClever
@D Stanley,我认为我们可以称这个方法为tricky而不是dirty,但它至少有一个额外的数组'paddingArray'。无论如何,我认为不会有更好的方法。谢谢@Federico Dipuma。 - ConductedClever

0
如果我理解您的问题正确的话,那么您想要获取一定量的行。也许只取 x 行是您正在寻找的:
ldr.ParseSubTrees
    .OrderBy(pst => pst.Height)
    .Select(pst => pst.SerializedTree)
    .Take(maxParseTreeDepth)
    .ToArray();

1
不。正如这段代码所示 > Console.WriteLine(arr.Take(4).Count()); > 3,take方法只是将结果向上取整。但我想要确切地设置长度。 - ConductedClever

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接