3

私は見つけましOrderedDictionaryたが、それは私が望むものではありません。OrderedDictionaryデータの辞書ビューまたはリスト ビューのいずれかを表示しているように見えますが、それらの間をうまく行き来することはできません。

例えば

OrderedDictionary mylist = new OrderedDictionary();

mylist.Add(1, "Hello");
mylist.Add(4, "World");
mylist.Add(7, "Foo");
mylist.Add(9, "Bar");

このコードを使用すると、 に直接アクセスmylist[7]して取得"Foo"したり、内容を正しい順序で反復処理したりできますが、「リストで Foo に続くものは何ですか?」という質問にはすぐには答えられません。

私が欲しいのは次のようなものです:

mylist.GetNode(7).Next.Value => "Bar"

このタスクを実行できる .NET および C# で利用できるものはありますか?

4

3 に答える 3

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
于 2012-09-11T13:54:38.313 に答える
1

インデックスに1つ追加できないのはなぜですか?

mylist[3] == "Foo";
mylist[3 + 1] == "Bar";

データ構造がランダムアクセスをサポートしている場合、リンクリストスタイルの動作を採用する理由がわかりません。

編集

OrderedDictionaryキーだけでなくインデックスも取得できるようですが、 MSDNを参照してください。

それ以外の場合は、独自の「次へ」ポインタを簡単に追加できます。

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;
}
于 2012-09-11T13:43:20.547 に答える
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]);
于 2012-09-11T14:07:20.710 に答える