我在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
而在选择表达式中我不能这样做。
答案 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();