2011-07-03 108 views

回答

7

假设你的比较操作是IEqualityComparer<T>或可转化为它,你罚款的LINQ:

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

显然,创建一个新的名单而不是删除从一个元素,但在大多数情况下,这没关系。你总是可以完全用新列表替换旧列表的内容之后,如果不是......

+0

为什么不做'oldList = oldList.Distinct(customComparer).ToList();'以避免创建一个新列表Mr.Skeet?它不好吗?它不工作吗? – Bastardo

+4

@JohnnyCageWins - 这不会阻止创建新列表,它只会覆盖引用新引用的旧引用。 –

+0

@Jonas H什么?严重吗?我猜想我认为记忆流是非常错误的,因为它会覆盖旧列表。我认为如果我们使用'oldList',就不需要创建了。没有任何方法吗?谢谢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); 
     } 
    } 
}