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