C# 在集合中循环时,如何确定当前项目的位置?
在集合中循环时,如何确定当前项目的位置 我正在处理按每个客户分组的决策数据,但我有一些业务逻辑,这取决于集合中的“位置”,即第一、第二、第三等,以及记录的其他属性,例如,如果是关于客户的第三个决策,且其在实例中的评级为a,则C# 在集合中循环时,如何确定当前项目的位置?,c#,linq,collections,C#,Linq,Collections,在集合中循环时,如何确定当前项目的位置 我正在处理按每个客户分组的决策数据,但我有一些业务逻辑,这取决于集合中的“位置”,即第一、第二、第三等,以及记录的其他属性,例如,如果是关于客户的第三个决策,且其在实例中的评级为a,则 更新:我很感激我可以在其中放置一个计数器并手动递增,但感觉不对,我以为.NET中有什么东西可以处理这个问题???标准的foreach没有提供任何东西。只需保持一个外部计数 可枚举项上存在重载。请选择提供当前项索引的扩展方法: 但是如果不知道您的代码在foreach中试图做
更新:我很感激我可以在其中放置一个计数器并手动递增,但感觉不对,我以为.NET中有什么东西可以处理这个问题???标准的
foreach
没有提供任何东西。只需保持一个外部计数
可枚举项上存在重载。请选择提供当前项索引的扩展方法:
但是如果不知道您的代码在foreach
中试图做什么,我就无法提供一个使用它的示例。理论上,您可以投影一个存储了索引的匿名类型,并在以后的foreach
中使用它。似乎是这样的。正如Adam所说,您可以使用Adams解决方案,或者对查询执行ToList()
multiples.IndexOf(grouping)
大概是这样的:
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;
我看不见你,你对你的决定和秩序有任何把握。
我猜您的数据来自长期数据源(如数据库或类似数据),您无法控制从数据源获取决策的顺序,尤其是在应用“分组方式”后
我会在决策
实体中添加一个“订单”字段(或列),以跟踪在将决策添加到数据源时设置的决策顺序。
这样,您就可以在业务逻辑中直接使用该字段
必须有很多方法来实现对决策顺序的跟踪,但是如果没有,你甚至不能确定它们是按什么顺序进行的。假设倍数
是一个列表
而不是IEnumerable
@AdamHouldsworth true,但是你可以做一个ToList()
在问题上,我是这样说的,因为你的答案不是,这在我看来是非常重要的。为什么不直接使用for
-循环而不是foreach
?在IEnumerable
上不可能重复@BigYellowCactus afor
循环,因为缺少索引器。@AdamHouldsworth我想调用ToList()不会太难IEnumerable上的
:-)
var multiples = from d in context.Decision_Data
group d by d.Client_No
into c
where c.Skip(1).Any()
select c;