2011-07-03 2 views

답변

7

당신은 LINQ와 함께, 귀하의 비교 작업이 IEqualityComparer<T>이거나로 변환 할 수있는 미세하고 가정 :

var newList = oldList.Distinct(customComparer).ToList(); 

는 물론 그 오히려 이전 하나의 요소를 제거하는 것보다 새로운 목록을 생성하고, 하지만 대부분의 경우 괜찮습니다.

+0

왜 안'oldList = oldList.Distinct (customComparer) .ToList()가 않는다'는 나쁜 새 목록의 Mr.Skeet을 만드는 피하기 위해 작동하지 않을까요? – Bastardo

+4

@ JohnnyCageWins - 새 목록 생성을 막지는 않겠지 만, 기존 목록에 대한 참조를 새 목록에 대한 참조로 덮어 씁니다. –

+0

@ Jonas H 뭐라고 요? 진심 으로요? 예전 목록을 덮어 쓰는 데있어 메모리 흐름이 매우 잘못되었다고 생각합니다. 나는 '올드리스트'를 사용하면 창작 할 필요가 없다고 생각했습니다. 어떤 방법이 있습니까? 고마워요. Mr.H . – Bastardo

6

당신은 Jon's answer으로 갈 수 ... 그렇지 않으면 당신은 항상 완전히 이후 새 목록으로 이전 목록의 내용을 대체 할 수있는, 또는 당신이 정말로 목록을 존재하는 에서 중복을 제거 할 경우,이 같은 뭔가 것 작업 :?

public static void RemoveDuplicates<T>(this IList<T> list, IEqualityComparer<T> comparer = null) 
{ 
    comparer = comparer ?? EqualityComparer<T>.Default; 

    var uniques = new HashSet<T>(comparer); 
    for (int i = list.Count - 1; i >= 0; --i) 
    { 
     if (!uniques.Add(list[i])) 
     { 
      list.RemoveAt(i); 
     } 
    } 
} 
관련 문제