Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

List set index c#

Tags:

arrays

c#

list

I am using a List construct to handle the sequence in which images are drawn in "OnPaint". Now if my images are re-ordered (e.g. "brought to front" or "..to back"), I'd need to reposition them in my List. I have trouble doing so, because List doesn't support a method similar to setIndex().

So what I am trying to do is basically:

    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)
    }

I want to be able to swap an index.. sort of. I could "insert" a new item into the List at the index it should go to and assign the value and then delete the other "source". However it doesn't seem elegant in any way.

I'd be glad for any hints and please excuse me if I overlooked a thread - I did search though, before asking.

dS.

like image 623
Igor Avatar asked Jan 22 '23 13:01

Igor


2 Answers

What's inelegant about doing the steps you want to do? If you want to change something's position within a List (which is a vector style collection) then what you want to do is insert it at the new position and remove it from the old. Precisely what you are complaining about having to do.

If it really upsets you then write an extension method:

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);
  }
}

Edit: Oh, you just want to swap? Simpler (and more efficient) still:

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;
  }
}
like image 91
Jon Hanna Avatar answered Jan 24 '23 04:01

Jon Hanna


Well, just performing a swap is easy:

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

But if you need to move one item and leave all other items in the same order with relation to each other, you should call RemoveAt followed by Insert. It won't be terribly efficient, but unless you've got a large list or you're doing this very often, it's unlikely to really cause you any problems.

like image 45
Jon Skeet Avatar answered Jan 24 '23 03:01

Jon Skeet