具有固定数组大小的C#ToArray()

时间:2017-08-26 13:16:44

标签: c# arrays

我在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();

不要担心上面的代码。问题是我希望矩阵是方形的。硬编码的列是正常的,但来自DB 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 个答案:

答案 0 :(得分:2)

快速而肮脏的解决方案是连接数组而不是使用Take()

在查询之前:

var paddingArray = new string[maxParseTreeDepth];

内部查询:

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

答案 1 :(得分:0)

如果我正确理解了您的问题,那么您只想获得一定数量的行。 也许只需要 x行就是你想要的:

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