Список индексов списка С#

Я использую конструкцию Список для обработки последовательности, в которой изображения рисуются в "OnPaint". Теперь, если мои изображения переупорядочены (например, "доведены до фронта" или ".. назад" ), мне нужно будет переместить их в свой список. У меня проблемы с этим, потому что List не поддерживает метод, похожий на setIndex().

Так что я пытаюсь сделать в основном:

private List<bitmapwithprops> activeImages = new List<bitmapwithprops>();
 public void addActiveImage(BitmapWithProps image)
 {
 activeImages.Add(image);
 }
 public BitmapWithProps getActiveImage(int index)
 {
 return activeImages[index];
 }
 public void removeActiveImage(int index)
 {
 activeImages.RemoveAt(index);
 }
 public void removeActiveImage(BitmapWithProps item)
 {
 activeImages.Remove(item);
 }
 public void swapActiveImageIndex(int sourceIndex, int destIndex)
 {
 // what would the code look like in here if I were to swap
 // the 2nd item (1) with the 4th one (3) in a 5-item-List (0 - 4)
 }
</bitmapwithprops></bitmapwithprops>

Я хочу иметь возможность поменять индекс. Я мог бы "вставить" новый элемент в список по индексу, в который он должен перейти, и присвоить значение, а затем удалить другой "источник". Однако это никоим образом не выглядит элегантным.

Я был бы рад любым намекам и, пожалуйста, извините меня, если я пропустил нить - я действительно искал, прежде чем спрашивать.

Ds.

3 ответа

Что нелепо делать шаги, которые вы хотите сделать? Если вы хотите изменить что-то в списке (это коллекция векторного стиля), то то, что вы хотите, нужно вставить в новую позицию и удалить из старого. Именно то, что вы жалуетесь на необходимость делать.

Если это действительно расстраивает вас, напишите метод расширения:

public static void MoveIndex<t>(this List<t> list, int srcIdx, int destIdx)
{
 if(srcIdx != destIdx)
 {
 list.Insert(destIdx, list[srcIdx]);
 list.RemoveAt(destIdx < srcIdx ? srcIdx + 1 : srcIdx);
 }
}
</t></t>

Изменить: О, вы просто хотите обменять? Упрощен (и более эффективный):

public static void SwapItems<t>(this List<t> list, int idxX, int idxY)
{
 if(idxX != idxY)
 {
 T tmp = list[idxX];
 list[idxX] = list[idxY];
 list[idxY] = tmp;
 }
}
</t></t>


Ну, просто выполнить обмен легко:

BitmapWithProps source = activeImages[sourceIndex];
BitmapWithProps dest = activeImages[destIndex];
activeImages[destIndex] = source;
activeImages[sourceIndex] = dest;

Но если вам нужно переместить один элемент и оставить все остальные предметы в том же порядке по отношению друг к другу, вы должны позвонить RemoveAt, а затем Insert. Это будет не очень эффективно, но если у вас нет большого списка или вы делаете это очень часто, это вряд ли действительно вызовет у вас какие-либо проблемы.


public void swapActiveImageIndex(int sourceIndex, int destIndex)
{
 var source = activeImages.Item[sourceIndex];
 var dest = activeImages.Item[destIndex];
 activeImages.Item[sourceIndex] = dest;
 activeImages.Item[destIndex] = source;
}

licensed under cc by-sa 3.0 with attribution.