基于索引遍历集合

本文关键字:遍历 集合 索引 于索引 | 更新日期: 2023-09-27 18:12:28

让我先解释一下情况:

我从集合上的二进制搜索中获得一个值,并快速跳转到该值以进行一些编码。接下来我想跳到列表中的下一项。但下一项并不完全是紧随其后的可能是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处,我如何跳转到索引3(0626)并消费/处理所有索引。请记住,这并不总是相同的。数据可以是不同的。所以我不能直接跳转:index + 3

下面是我的代码:

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

oldPointer是我通过二分查找得到的索引。我拿起这个,造了一个圣殿。在这之后我想跳到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的东西,但是请注意,这使得对数据的更改更加复杂。

看看Skip List, http://en.wikipedia.org/wiki/Skip_list

它将允许你在链表中向前跳转超过1,但缺点是找到你的搜索开始将是O(n)