2014-02-28 11 views
0

목록이 있는데 그 중 일부 요소를 제거하고 싶습니다.목록에서 요소 제거

문제 하나 이상의 요소를 제거하려면 제거하려는 항목을 놓치게됩니다.

`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); 
      } 
+0

제거되는 한, 어떻게 중요합니까? – John

+0

왜 그게 당신이 원하는 것이 아니겠습니까? 내 생각 엔 가장 낮은 인덱스를 먼저 제거하고 인덱스 순서를 변경 한 다음이를 망쳐 버리는 것입니다. 제거하고 제외 할 항목의 두 번째 목록을 만들려고 했습니까? – Dassina

+0

당신은 그들을 모두 동시에 제거해야하는 이유가 무엇입니까? –

답변

3

일단 특정 인덱스에서 항목을 삭제하면 다른 모든 인덱스가 변경된다는 문제가 있다고 생각합니다. {"a", "b", "c"} 배열이 있고 abindexes = [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); 
    } 
} 

작업을해야 그!

+0

효과가있었습니다! 고마워요. 내림차순으로 제거하는 것이 트릭이었습니다. – Matimont

+0

+1 - 나는 그 질문이 무엇일지도 모른다고 생각했고, 색인을 내림차순으로 정렬하는 것과 같은 해결책을 게시하려했습니다. "무작위"는 저를 던졌습니다 :) – ksun

1

질문은 매우 명확하지 않다,하지만 경우 : 모든 의견

덕분에, 가장 좋은 방법은 다음과 같이 내림차순 루프를하고 있었다 목록의 임의의 인덱스에서 지정된 수의 요소를 제거하려면 여기에서 수행 할 방법입니다. (이 예는 String 객체 목록과 함께 사용되지만 물론 객체를 사용하도록 변경할 수도 있습니다.) B, C, F, H, I, J, K, M, N, O, P, Q, R, U, V, X, Y : 그것을 실행하면

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); 
      } 
     } 

는 I 출력있어 , Z
물론 임의의 항목을 제거하기 때문에 일반적으로 다릅니다.

+1

나는 "random"의 실제 정의 대신에 "호출자가 임의로 지정한"것을 의미하기 위해 무작위로 사용하고 있다고 가정하고 있습니다 ... "임의"의 의미는 구어체로 명확하게 도출되었습니다 :) –

+0

의견을 보내 주셔서 감사합니다. 모든 사람을 무작위로 혼란스럽게 생각합니다. 실제로 나는 사용자가 삭제하도록 선택한 요소를 가진 두 번째 목록을 가지고 있으며이를 주 목록에서 제거해야합니다. 내 편집을 참조하십시오, 거기에 대답을 넣어. 귀하의 제안에 감사드립니다! – Matimont