0

在遍历集合时如何确定当前项目的位置?

我正在处理按每个客户分组的决策数据,但我有一些业务逻辑取决于集合中的“位置”,即第 1、第 2、第 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

4 回答 4

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;
于 2012-07-25T09:30:58.820 回答
3

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

Enumerable.Select提供当前项目索引的扩展方法有一个重载:

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

但是,如果不知道您的代码在尝试做什么,foreach我就无法真正提供使用它的示例。从理论上讲,您可以投影一个存储了索引的匿名类型,然后将其与foreach. 看来jeroenh 的答案是沿着这条路线走的。

于 2012-07-25T09:14:14.943 回答
0

正如亚当所说,您可以使用 Adams 解决方案,也可以ToList()在查询中执行

multiples.IndexOf(grouping)
于 2012-07-25T09:14:20.217 回答
0

我看不出你怎么能确定你的决定顺序。我猜您的数据来自长期数据源(例如数据库等),并且您无法控制从数据源中获取决策的顺序,尤其是在应用“组经过”。

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

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

于 2012-07-25T09:33:43.487 回答