C# 基于索引遍历集合

C# 基于索引遍历集合,c#,collections,iteration,C#,Collections,Iteration,让我先解释一下情况: 我从对集合的二进制搜索中收到一个值,然后快速跳转到该值进行编码。下一步我想跳到列表中的下一项。但下一个项目并不完全是后面的项目,可能是3或4个项目之后。这是我了解情况的资料 Time ID 0604 ABCDE 0604 EFGH 0604 IJKL 0626 Some Data1 0626 Some Data2

让我先解释一下情况:

我从对集合的二进制搜索中收到一个值,然后快速跳转到该值进行编码。下一步我想跳到列表中的下一项。但下一个项目并不完全是后面的项目,可能是3或4个项目之后。这是我了解情况的资料

    Time          ID
    0604          ABCDE
    0604          EFGH
    0604          IJKL
    0626          Some Data1
    0626          Some Data2
    0626          Some Data3
    0626          Some Data4
比如说二进制搜索返回的索引0,我跳到索引0 0604 ABCDE。我处理/消耗所有0604。现在我在索引0处,如何跳转到索引30626并使用/处理所有这些内容。记住,这并不总是一样的。数据可以不同。所以我不能简单地跳转:索引+3

这是我的密码:

 var matches = recordList.Where(d => d.DateDetails == oldPointer);
 var lookup = matches.ToLookup(d => d.DateDetails).First();
 tempList = lookup.ToList();// build templist

这里是我从二进制搜索中得到的索引。我拿起这个,建造了一个圣殿骑士。现在,在这之后,我想跳到0626。

您通常希望有多少记录使用相同的旧指针?通常会小于100吗?如果是这样的话:不要使它过于复杂-只需迭代:

public static int FindNextPointerIndex(int oldIndex, string oldPointer, ...)
{
    for(int i = oldIndex + 1; i < collection.Count ; i++)
    {
        if(collection[i].DateDetails != oldPointer) return i;
    }
    return -1;
}

如果你想要更优雅的东西,你必须通过DateDetails对数据进行预索引,可能在整个集合中使用类似ToLookup的东西,但是:请注意,这会使数据的更改更加复杂。

看看跳过列表


它将允许您在链接列表中向前跳转1个以上,但查找搜索起点的反面将位于

您的列表是一个数据容器,它不应该是您工作流程的一部分,而是您设计的一部分。除了时间差之外,我在这里看不到任何将项目0与项目3联系起来的相关性?但是有4个不同的0626,你怎么知道跳到哪一个?编辑:我注意到你无论如何都在处理它们,那么为什么你需要跳转呢?你的收藏是什么?它是一个diccionary,跳转的规则是什么?请检查我的当前代码,我正在将binarysearch索引放入一个模板,以便在某处使用这些数据。现在我想跳到0626。这怎么可能。在那里查找的目的是什么?Where告诉我们所有的DateDetails都是一样的,所以做一个ToLookup…首先。ToList会给我们返回:我们在匹配中有相同的东西…?这是一个非常非常昂贵的方法来建立临时列表,除非数据非常小;如果它很小,那就无关紧要了。临时列表在这里并没有真正帮助您,除非您只是指:index+=tempList.Count;你能用代码来解释你的第二点吗。感谢you@user726720到底是哪一位?我想说的是,有一些方法可以构建一个对象模型,允许在大型集合上进行有效的移动,但坦率地说:因为您只需要下一个不同的值:只需向前走,直到找到它。如果大小很大,可能是一个值的很多很多,实际上可以在当前位置和集合末尾之间进行二进制搜索。这里的二进制搜索没有帮助,因为我不知道下一个值是什么。也许你可以简单地手动迭代,找到下一个不同值的索引。如果你能解释你的最后一点。在整个收藏中做一个托卢库普。可以这样做来找到下一组。这将如何在代码方面实现。@user726720除非分组已经存在用于其他目的,否则您不会这样做。。。