如何在循环收集时确定当前项目的位置?
我正在处理决策数据,按每个客户分组,但我有一些业务逻辑,这取决于集合中的“位置”,即第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中处理这个??
答案 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
实体添加“订单”字段(或列),以跟踪在将决策添加到数据源时将进行决策的顺序。
这样,您就可以在业务逻辑中直接使用此字段。
必须有很多方法来实现对决策顺序的跟踪,但如果没有,您甚至无法确定它们的编制顺序。