我试图为List分配一个行号和一个设置号,但是set编号在一组中包含错误的行数。
var objx = new List<x>();
var i = 0;
var r = 1;
objY.ForEach(x => objx .Add(new x
{
RowNumber = ++i,
DatabaseID= x.QuestionID,
SetID= i == 5 ? r++ : i % 5 == 0 ? r += 1 : r
}));对于上面的代码,如objY包含23行,我希望在5-5集中拆分23行。因此,上面的代码将给出类似于的序列,只考虑RowNumber
[1 2 3 4 5][6 7 8 9][ 10 11 12 13 14 ].......这是一个有效的逻辑,如果我将Setid的逻辑更改为
SetID= i % 5 == 0 ? r += 1 : r结果会像
[1 2 3 4 ][5 6 7 8 9][10 11 12 13 14].再次更正代码的输出
但预计为5组。
[1 2 3 4 5][ 6 7 8 9 10].........我所缺少的.
我应该认真上数学课的。
发布于 2013-02-07 16:50:47
我想你想要这样的东西:
var objX = objY.Select((x, i) => new { ObjX = x, Index = i })
.GroupBy(x => x.Index / 5)
.Select((g, i) =>
g.Select(x => new objx
{
RowNumber = x.Index + 1
DatabaseID = x.ObjX.QuestionID,
SetID = i + 1
}).ToList())
.ToList();注意,我是按x.Index / 5进行分组,以确保每个组都有5个项。
这是一个演示。
更新
如果你能解释一下你的逻辑,这将是非常有帮助的。
我该从哪里开始?我使用Linq方法来选择和分组原始列表,以创建一个新的List<List<ObjX>>,其中每个内部列表都有最大的5个元素(如果总计数不能被5除,则在最后一个元素中较少)。
Enumerable.Select允许从输入序列中投射一些东西来创建新的东西。此方法可与循环中的变量相媲美。在本例中,我使用原始对象和列表中的索引(Select有合并索引的过载 )构建匿名类型。我创建这个匿名类型只是为了简单的查询,因为我需要稍后在GroupBy中的索引。
Enumerable.GroupBy允许将序列中的元素按指定的键分组。这个键可以是从元素派生的任何东西。这里我使用的是最大大小为5的索引两个构建组:
.GroupBy(x => x.Index / 5)这是因为C# (或C)中的整数除法总是在int中进行,其中的余数被截断(与VB.NET btw不同),所以3/4的结果是0。可以使用此事实生成指定大小的组。
然后,我在组上使用Select创建内部列表,再次使用索引重载来设置组的SetId:
.Select((g, i) =>
g.Select(x => new objx
{
RowNumber = x.Index + 1
DatabaseID = x.ObjX.QuestionID,
SetID = i + 1
}).ToList())最后一步是在IEnumerable<List<ObjX>>上使用IEnumerable<List<ObjX>>创建最终的List<List<ObX>>。这也是查询的“物化”。看看延迟执行,特别是乔恩·斯基茨博客,了解更多信息。
https://stackoverflow.com/questions/14756272
复制相似问题