如何在循环收集时确定当前项目的位置?

时间:2012-07-25 09:12:00

标签: c# linq collections

如何在循环收集时确定当前项目的位置?

我正在处理决策数据,按每个客户分组,但我有一些业务逻辑,这取决于集合中的“位置”,即第1,第2,第3等,以及记录的其他属性,例如如果这是关于客户的第3个决定,并且他们在实例中的评级是A然后......

var multiples = from d in context.Decision_Data
                group d by d.Client_No
                    into c
                    where c.Count() > 1
                    select c;

foreach (var grouping in multiples)
{
    foreach (var item in grouping)
    {
        // business logic here for processing each decision for a Client_No
        // BUT depends on item position ... 1st, 2nd, etc.
    }

更新:我很感激我可以放入一个计数器并手动递增,但感觉错误我认为有的东西在.NET中处理这个??

4 个答案:

答案 0 :(得分:4)

这样的事情:

foreach (var grouping in multiples)
{
    foreach (var x in grouping.Select(index,item) => new {index, item})
    {
        // x.index is the position of the item in this group
        // x.item is the item itself
    }
}

附注:您可以更有效地实现LINQ查询。 Count() > 1将完全枚举每个组,无论如何你可能会在foreach中完成。相反,您可以使用Skip(1).Any(),它会在找到两个项目后立即停止对该组进行迭代。显然,这只会对(非常)大的输入列表产生真正的影响。

var multiples = from d in context.Decision_Data
                group d by d.Client_No
                    into c
                    where c.Skip(1).Any() 
                    select c;

答案 1 :(得分:3)

标准foreach没有提供任何内容。只需保持外部计数。

Enumerable.Select扩展方法存在重载,提供当前项的索引:

http://msdn.microsoft.com/en-us/library/bb534869

但是在不知道代码在foreach中尝试做什么的情况下,我无法真正提供使用它的示例。理论上,您可以投影存储索引的匿名类型,稍后使用foreach。似乎jeroenh's answer走了这条路。

答案 2 :(得分:0)

正如亚当所说,您可以选择Adams解决方案,也可以对查询执行ToList()

multiples.IndexOf(grouping)

答案 3 :(得分:0)

我没有看到你,你可以对你的决定令有任何确定性。 我猜测您的数据来自长期数据源(例如数据库等),并且您无法控制从数据源获取决策的顺序,尤其是在应用“组”之后通过”。

我会向Decision实体添加“订单”字段(或列),以跟踪在将决策添加到数据源时将进行决策的顺序。 这样,您就可以在业务逻辑中直接使用此字段。

必须有很多方法来实现对决策顺序的跟踪,但如果没有,您甚至无法确定它们的编制顺序。