Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在集合中循环时,如何确定当前项目的位置?_C#_Linq_Collections - Fatal编程技术网

C# 在集合中循环时,如何确定当前项目的位置?

C# 在集合中循环时,如何确定当前项目的位置?,c#,linq,collections,C#,Linq,Collections,在集合中循环时,如何确定当前项目的位置 我正在处理按每个客户分组的决策数据,但我有一些业务逻辑,这取决于集合中的“位置”,即第一、第二、第三等,以及记录的其他属性,例如,如果是关于客户的第三个决策,且其在实例中的评级为a,则 更新:我很感激我可以在其中放置一个计数器并手动递增,但感觉不对,我以为.NET中有什么东西可以处理这个问题???标准的foreach没有提供任何东西。只需保持一个外部计数 可枚举项上存在重载。请选择提供当前项索引的扩展方法: 但是如果不知道您的代码在foreach中试图做

在集合中循环时,如何确定当前项目的位置

我正在处理按每个客户分组的决策数据,但我有一些业务逻辑,这取决于集合中的“位置”,即第一、第二、第三等,以及记录的其他属性,例如,如果是关于客户的第三个决策,且其在实例中的评级为a,则


更新:我很感激我可以在其中放置一个计数器并手动递增,但感觉不对,我以为.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 a
for
循环,因为缺少索引器。@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;