我找到了OrderedDictionary
,但它并没有完全符合我的要求。 OrderedDictionary
似乎提供了数据的字典或列表视图,但您无法很好地跨越它们。
E.g。
OrderedDictionary mylist = new OrderedDictionary();
mylist.Add(1, "Hello");
mylist.Add(4, "World");
mylist.Add(7, "Foo");
mylist.Add(9, "Bar");
使用此代码,我可以直接访问mylist[7]
并获取"Foo"
,或者我可以按正确的顺序迭代内容,但我无法快速回答“Foo in the following Foo in清单?“
我想要的是:
mylist.GetNode(7).Next.Value => "Bar"
.NET和C#中是否有可以执行此任务的内容?
答案 0 :(得分:3)
使用SortedList
类(是的,我们必须击败那个叫SortedList
这个名字的人。)
static class SortedListExtensions
{
public static TValue GetNextValueOrDefault<TKey, TValue>(this SortedList<TKey, TValue> list, TKey key)
{
var indexOfKey = list.IndexOfKey(key);
if (indexOfKey == -1)
return default(TValue);
if (++indexOfKey == list.Count)
return default(TValue);
return list.Values[indexOfKey];
}
}
var myList = new SortedList<int, string>
{
{ 1, "Hello" },
{ 4, "World" },
{ 7, "Foo" },
{ 9, "Bar" },
};
Console.WriteLine(myList.GetNextValueOrDefault(7)); // "Bar"
Console.WriteLine(myList.GetNextValueOrDefault(9)); // null
答案 1 :(得分:1)
为什么不能只为索引添加一个?
mylist[3] == "Foo";
mylist[3 + 1] == "Bar";
如果数据结构支持随机访问,我就看不出为什么要加入链表样式行为了。
修改强>
虽然OrderedDictionary
可以使用索引以及键see MSDN
否则你可以很容易地添加你自己的'Next'指针:
class DictionaryNode {
public int? Next { get; set; }
public string Value { get; set; }
}
// Inside the appropriate class
int? lastKey = null;
void AddItem(int key, string value) {
mylist.Add(key, new DictionaryNode { Next = null, Value = value });
if (lastKey.HasValue) {
mylist[lastKey].Next = key;
}
lastKey = key;
}
答案 2 :(得分:0)
丑陋,但你可以像这样快速地做到这一点:
OrderedDictionary mylist = new OrderedDictionary();
mylist.Add(1, "Hello");
mylist.Add(4, "World");
mylist.Add(7, "Foo");
mylist.Add(9, "Bar");
int key = 7;
Console.WriteLine("value: " + mylist[key as object]);
var nextKeys = mylist.Keys.Cast<int>().Where(i => i > key);
if (nextKeys.Count() == 0)
Console.WriteLine("next value: (none)");
else
Console.WriteLine("next value: " + mylist[nextKeys.Min() as object]);