从列表中删除元素

时间:2014-02-28 21:48:03

标签: c# list

我有一个列表,我想从中删除一些元素。

我遇到的问题是,如果我想删除多个元素,那么我将失去对正在移除的内容的控制权。

看,代码`mylist.Removeat(index)做的很好,但是,如果我有一个列表o让我们说10个元素,我需要随机删除6个,我似乎找不到一个函数一次删除它们,相反,它会删除第一个元素,然后删除第二个元素,依此类推,这不是我想要的。

谢谢,

编辑:

感谢大家的评论,最好的方法是循环降序:

            int img_count = img.Count;

            for (int i = img_count; i >0; --i)
            {
                if (images_to_delete.Contains(i)) img.RemoveAt(i);
            }

2 个答案:

答案 0 :(得分:3)

我认为您的问题是,一旦删除某个索引处的项目,所有其他索引都会移位。就像你有一个{"a", "b", "c"}数组一样,想通过传递a删除bindexes = [0,1]。致电removeAt(0)后,现在“b”位于索引0。

处理它的一种方法是注意只有更高索引被移位的事实。因此,如果删除第5个元素,例如0-4仍然具有相同的含义;只有5岁及以上的人受到影响。

因此,您可以按降序(从最高到最低)删除索引!例如:

var vals = new[]{ "a", "b", "c" };
RemoveMultiple(vals, 0, 1);

然后RemoveMultiple看起来像这样:

public void RemoveMultiple<T>(List<T> list, params int[] indexes)
{
   // if this next line gives you a compiler error, you need to include
   // linq by putting a "using System.Linq;" at the very top of the file.
   var sortedIndexes = indexes.OrderByDescending(i => i);
   foreach(var indexToRemove in sortedIndexes)
   {
      list.RemoveAt(indexToRemove);
   }
}

这应该有用!

答案 1 :(得分:1)

问题不是很清楚,但如果你想从List中随机索引中删除指定数量的元素,这里有一个方法可以做到这一点。 (这是一个String对象列表的示例,但您可以将其更改为使用任何对象)。

private static List<String> strList = new List<String>();        
        static void Main(string[] args)
        {
            strList.AddRange("A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z".Split(','));
            removeRandomItemsFromList(strList, 8);
            Console.WriteLine(String.Join(",",strList.ToArray()));
            Console.ReadLine();
        }

        private static void removeRandomItemsFromList(List<String> list, int numToRemove){
            Random randGenerator = new Random();
            if(numToRemove >= list.Count()){
                Console.WriteLine("Num to remove is as big or larger than list size, clearing list.");
                list.Clear();
                return;                
            }

            for (int i = 0; i < numToRemove; i++)
            {
                int randIndex = randGenerator.Next(list.Count - 1); //get random index within bounds of list
                list.RemoveAt(randIndex);
            }
        }

当我运行它时,我得到了输出: B,C,F,H,I,J,K,M,N,O,P,Q,R,U,V,X,Y,Z
但当然它通常会有所不同,因为它会删除随机项目。