繁体   English   中英

从列表中删除元素

[英]Remove elements from a list

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

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

看,代码`mylist.Removeat(index)可以很好地工作,但是,如果我有一个列表,比如说有10个元素,而我需要随机删除6个元素,那么我似乎没有找到可以将它们全部删除的函数而是一次删除了第一个元素,然后删除了第二个元素,依此类推,这并不是我真正想要的。

谢谢,

编辑:

谢谢大家的评论,最好的方法是像这样循环下降:

            int img_count = img.Count;

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

我认为您的问题是,一旦删除某个索引处的项目,所有其他索引都会转移。 就像您有{"a", "b", "c"}的数组一样,并且想要通过传递indexes = [0,1]来删除ab 一旦调用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);
   }
}

那应该工作!

这个问题不是很清楚,但是如果您想从列表中的随机索引中删除指定数量的元素,可以使用此方法。 (这是一个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
但是当然,由于它会删除随机项目,因此通常会有所不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM