我有一个列表,我想从中删除一些元素。
我遇到的问题是,如果我想删除多个元素,那么我将失去对正在移除的内容的控制权。
看,代码`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);
}
答案 0 :(得分:3)
我认为您的问题是,一旦删除某个索引处的项目,所有其他索引都会移位。就像你有一个{"a", "b", "c"}
数组一样,想通过传递a
删除b
和indexes = [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
但当然它通常会有所不同,因为它会删除随机项目。