列表集索引c#

列表集索引c#,c#,arrays,list,C#,Arrays,List,我正在使用一个列表结构来处理在“OnPaint”中绘制图像的顺序。现在,如果我的图像被重新排序(例如“放在前面”或“放在后面”),我需要在列表中重新定位它们。 我这样做有困难,因为列表不支持类似于setIndex()的方法 所以我想做的基本上是: private List<BitmapWithProps> activeImages = new List<BitmapWithProps>(); public void addActiveImage(Bitm

我正在使用一个列表结构来处理在“OnPaint”中绘制图像的顺序。现在,如果我的图像被重新排序(例如“放在前面”或“放在后面”),我需要在列表中重新定位它们。 我这样做有困难,因为列表不支持类似于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)
    }
private List activeImages=new List();
public void addActiveImage(BitmapWithProps图像)
{
activeImages.Add(image);
}
公共位图WithProps getActiveImage(int索引)
{
返回活动图像[索引];
}
公共void removeActiveImage(整数索引)
{
activeImages.RemoveAt(索引);
}
public void removeActiveImage(BitmapWithProps项目)
{
activeImages.Remove(项目);
}
公共无效swapActiveImageIndex(int-sourceIndex、int-destIndex)
{
//如果我要交换,这里的代码会是什么样子
//5项列表(0-4)中的第2项(1)与第4项(3)
}
我希望能够交换索引。。某种程度上。我可以将一个新项目“插入”到列表中它应该去的索引处,分配值,然后删除另一个“源”。然而,它看起来一点也不优雅

我很高兴得到任何提示,如果我忽略了一条线索,请原谅——我在问之前确实搜索过


dS.

做你想做的步骤有什么不雅之处?如果要更改某个对象在列表中的位置(这是一个向量样式集合),则要做的是将其插入新位置,然后从旧位置删除。这正是你抱怨不得不做的事情

如果真的让你不高兴,那么写一个扩展方法:

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);
  }
}
publicstaticvoidmoveindex(这个列表,int-srcIdx,int-destIdx)
{
if(srcIdx!=destIdx)
{
插入(destIdx,list[srcIdx]);
list.RemoveAt(destIdx
编辑:哦,你只是想交换?更简单(也更高效):

publicstaticvoidswapitems(这个列表,int-idxX,int-idxY)
{
如果(idxX!=idxY)
{
T tmp=列表[idxX];
列表[idxX]=列表[idxY];
列表[idxY]=tmp;
}
}

好吧,只需执行交换就很容易了:

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

但是,如果需要移动一个项目,并使所有其他项目彼此保持相同的顺序,则应调用
RemoveAt
,然后调用
Insert
。它的效率不会太高,但除非你有一个很大的列表,或者你经常这样做,否则它不太可能真正给你带来任何问题。

谢谢。实际上我已经考虑过插入/删除,但我认为有更好的方法,比如真的。。交换什么的。另一方面,你的方法正是我想做的。现在我只需要弄清楚如何将此方法作为扩展添加到列表:)。谢谢你,投票支持。如果这些方法被放在调用代码的“可见”静态类中,那么我也添加了交换,然后
activeImages.MoveIndex(1,3)
activeImages.SwapItems(1,3)
将在C#3或更高版本中执行适当的操作。C#2或更低,您需要去掉“this”并将它们作为静态方法调用,或者只执行与方法相同的操作。请注意,应该首选swap方法,因为它是O(1),而List.Insert和List.RemoveAt都是O(n)。他们可能不得不上下移动列表中的剩余元素,以保持即时列表的良好定义(但实际上您只关心最终结果)。啊。谢谢你的提示,Gnafoo。这就是我寻求帮助的原因,否则我可能已经实现了一个实际可行的方法,但并不“优雅”,因此需要更多的时间来完成。然而,当不合适时(将第一项移动到第四位),则通过一系列交换进行交换也是O(n),尽管对于较小的n,并且具有更昂贵的常数,因此我选择直接方法,除非列表可能非常大,或者在循环中移动。
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;
}
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;
}