Я столкнулся с проблемой SortedList, когда 2 метода дают 2 разных результата.
//Item Data is one of this sortedList item
var itemPos = Items.IndexOfValue(ItemData);
Item item;
Items.TryGetValue(itemPos, out item);
Результат не так очевиден. Я буду оперировать цифрами, а не абстрактными буквами, чтобы лучше проиллюстрировать происходящее.
itemPos устанавливается на 5. Хорошо! Затем мы пытаемся снова получить этот элемент из этого индекса, но нет. Он возвращает ноль. Конечно, это происходит не сразу. Этот код вызывается до того, как это произойдет.
public void MoveItem(int indexFrom, int indexWhere)
{
Item itemToSawp;
Items.TryGetValue(indexFrom, out itemToSawp);
Items.Remove(indexFrom);
Items.Add(indexWhere, itemToSawp);
}
Чтобы переместить элементы в отсортированном списке, мы должны удалить и снова добавить элемент. В порядке! Отладка говорит, что операция прошла замечательно, и мой элемент теперь имеет индекс 5, я переместил его из индекса 4. Там, где индекс 5 был пустым до метода MoveItem.
Или он был пуст? Перед этой операцией у меня был индекс 5, заполненный вещами, и я вызвал простые Items.Remove(5);
Но теперь происходит то, что я описал ранее.
Стоит отметить, что это происходит только тогда, когда я перемещаю элемент вверх по индексу, смотрите с 4 по 5. При переходе с 5-4 все работает корректно.
Ты хоть представляешь, что здесь происходит? Я использую .NET 3.5
Полный код
using System;
using System.Collections.Generic;
class Program
{
static SortedList<int, ItemData> Items = new SortedList<int, ItemData>();
static void Main(string[] args)
{
var Foo = new ItemData();
Items.Add(0, Foo);
Items.Add(1, new ItemData());
Items.Remove(1);
MoveItem(0, 1);
var itemPos = Items.IndexOfValue(Foo);
Console.WriteLine(itemPos);
//Console should return 1 i think
ItemData item;
Items.TryGetValue(itemPos, out item);
}
public static void MoveItem(int indexFrom, int indexWhere)
{
ItemData itemToSawp;
Items.TryGetValue(indexFrom, out itemToSawp);
Items.Remove(indexFrom);
Items.Add(indexWhere, itemToSawp);
}
class ItemData
{
}
}
РЕДАКТИРОВАТЬ: Это немного сбивает с толку, но! Индексатор (посмотрите на его имя: P) Возьмите в качестве аргумента KEY, а не INDEX. Это то, что меня смутило, и я все перепутал. Как сказал Кристоф. Лучше использовать свой собственный список, который вы можете использовать по желанию или внимательно прочитать документацию.