基于索引迭代集合

时间:2014-07-10 07:08:38

标签: c# collections iteration

让我先解释一下情况:

我从一个集合中的二进制搜索中收到一个值,并快速跳转到那个进行编码。接下来我想跳转到列表中的下一个项目。但是下一个项目并不完全是跟随它的那个项目可能是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。

2 个答案:

答案 0 :(得分:0)

您通常期望具有相同“旧指针”的记录数量是多少?通常会低于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)

查看跳过列表,http://en.wikipedia.org/wiki/Skip_list

它允许您在链接列表中向前跳转超过1,但找不到搜索开头的向下将是O(n)