首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >增量前编号作为行号列出

增量前编号作为行号列出
EN

Stack Overflow用户
提问于 2013-02-07 16:39:57
回答 1查看 265关注 0票数 1

我试图为List分配一个行号和一个设置号,但是set编号在一组中包含错误的行数。

代码语言:javascript
运行
复制
 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

代码语言:javascript
运行
复制
[1 2 3 4 5][6 7 8 9][ 10 11 12 13 14 ].......

这是一个有效的逻辑,如果我将Setid的逻辑更改为

代码语言:javascript
运行
复制
 SetID= i % 5 == 0 ? r += 1 : r

结果会像

代码语言:javascript
运行
复制
[1 2 3 4 ][5 6 7 8 9][10 11 12 13 14].

再次更正代码的输出

但预计为5组。

代码语言:javascript
运行
复制
[1 2 3 4 5][ 6  7 8 9 10].........

我所缺少的.

我应该认真上数学课的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-07 16:50:47

我想你想要这样的东西:

代码语言:javascript
运行
复制
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的索引两个构建组:

代码语言:javascript
运行
复制
.GroupBy(x => x.Index / 5)

这是因为C# (或C)中的整数除法总是在int中进行,其中的余数被截断(与VB.NET btw不同),所以3/4的结果是0。可以使用此事实生成指定大小的组。

然后,我在组上使用Select创建内部列表,再次使用索引重载来设置组的SetId

代码语言:javascript
运行
复制
.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>>。这也是查询的“物化”。看看延迟执行,特别是乔恩·斯基茨博客,了解更多信息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14756272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档