C# 基于索引遍历集合
让我先解释一下情况: 我从对集合的二进制搜索中收到一个值,然后快速跳转到该值进行编码。下一步我想跳到列表中的下一项。但下一个项目并不完全是后面的项目,可能是3或4个项目之后。这是我了解情况的资料C# 基于索引遍历集合,c#,collections,iteration,C#,Collections,Iteration,让我先解释一下情况: 我从对集合的二进制搜索中收到一个值,然后快速跳转到该值进行编码。下一步我想跳到列表中的下一项。但下一个项目并不完全是后面的项目,可能是3或4个项目之后。这是我了解情况的资料 Time ID 0604 ABCDE 0604 EFGH 0604 IJKL 0626 Some Data1 0626 Some Data2
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除非分组已经存在用于其他目的,否则您不会这样做。。。