C#排序列表:如何获取下一个元素?

14

我想知道如何获取 C# 排序列表中的下一个元素。到目前为止,我想出了以下代码:

SortedList<int, Bla> mList;

Bla someElement = mList[key];
Bla next        = mList[mList.Keys[mList.IndexOfKey(key) + 1]];

我不确定那是否是最明智的方式;-)


抱歉,我已经添加了列表的声明... - Boris
你不能单独保留一个索引变量吗? - James
1
foreach (KeyValuePair<int, Bla> entry in mList){ ... } 在 mList 中,对于每个 KeyValuePair<int, Bla> 的 entry { ... } - Polity
2
使用IndexOfKey和GetByIndex。 - Hans Passant
2
@HansPassant 如果您将此作为答案发布,我会点赞的。这里似乎没有其他人能够回答实际提出的问题。 - Robert Harvey
4个回答

15

既然可以通过索引(参见备注部分)来访问SortedList,我建议使用以下代码:

var index = mList.IndexOfKey(key);
var first = mList.Values[index];
var second = mList.Values[index + 1];

使用这种方法查找的复杂度为单次查找的 O(log n) 复杂度。

下面是使用 LINQ 的方式:

var items = mList.SkipWhile(m => m.Key != key).Select(m => m.Value).Take(2).ToList(); // Avoid double-enumeration by calling ToList
var first = mList[0];
var second = mList[1]; 

这将仅枚举一次。它会以 O(n) 的时间复杂度执行。


那真的完成了任务。非常感谢! - Boris

6

SortedList 可以通过键和索引进行访问。

var IndexOfKey = mList.IndexOfKey(key);

增加索引值,

IndexOfKey++; //Handle last index case

通过索引获取下一个项目。

var nextElement = mList.GetByIndex(IndexOfKey);

这与 SortedList<int, Bla> 有关吗?在泛型下,SortedList 没有 GetByIndex,除非我理解错了什么。 - V4Vendetta
@Boris... 我以为你在使用 SortList - parapura rajkumar
我希望这些赞不是因为HansPassant在评论中提出的建议。 - V4Vendetta
1
@V4Vendetta 暗示的力量 :) 虽然如果存在 GetByIndex,这是一个很好的答案。但实际上,你必须使用 mList.Values[index] - Scott Rippey
@ScottRippey,这在MSDN上的SortList中确实有。 - parapura rajkumar
显示剩余3条评论

3

使用枚举器:

 IDictionaryEnumerator iterator = mList.GetEnumerator();
 iterator.MoveNext();
 Bla first = iterator.Value;
 iterator.MoveNext();
 Bla next = iterator.Value;

但是我认为原帖作者已经有了一个想要查找下一个元素的元素。 - parapura rajkumar
没错。我想在列表中找到一个元素(最好是非常快地),然后从那里开始迭代... - Boris
这将获取前两个项目,甚至不会查看“key”。 - Scott Rippey

-1
SortedList<int, Bla> mList;
int key = 0;
Bla someElement = mList.Values[key];

...
key = 1;
Bla next        = mList.Values[key];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接