2014-02-28 143 views
0

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

问题我碰到的是,如果我想删除多个元素,那么我失去了我要去除的控件。如果我有一个列表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

只要他们被删除,为什么它关系如何? – John

+0

为什么这不是你想要的?我的猜测是,它首先删除最低的索引,改变索引排序,并将其搞砸。你有没有尝试创建第二个项目列表来删除和做一个除外? – Dassina

+0

是否有一个原因,你为什么需要他们都在同一时间删除? –

回答

3

我认为你的问题是,一旦你删除某个索引的项目,所有其他索引转移。如果您有一组{"a", "b", "c"},并想通过传入indexes = [0,1]删除ab。一旦你呼叫removeAt(0),现在“b”在索引0处。

处理它的一种方法是注意只有更高的索引被移位的事实。因此,如果您删除第五个元素,例如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); 
    } 
} 

这应该工作!

+0

它的工作!非常感谢,以降序删除的技巧做到了 – Matimont

+0

+1 - 我认为这可能是被问到的问题,并且即将发布相同的解决方案,并按降序对索引进行排序。 “随机”把我扔掉,虽然:) – ksun

1

的问题不是非常清楚,但如果你想从列表中随机索引中删除指定数量的元素,这里是一个方法,将做到这一点。 (这是一个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
但当然它通常会有所不同,因为它是删除随机项目。

+1

我假设他们使用随机的意思是“由调用者任意指定”而不是“随机”的实际定义...“随机”的含义肯定是通俗地屠杀:) –

+0

感谢您的意见,我猜我用随机说法混淆了每个人。实际上,我有第二个列表,其中包含用户选择要删除的元素,并且需要从主列表中删除这些元素。看到我的编辑,我提出了答案。感谢您的建议! – Matimont