2014-02-28 146 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