2
我需要一种C#方法来使用自定义比较操作从List<T>
中删除重复项。在.NET 4中。是否有,还是必须自己写?从列表中删除重复项的C#方法<T>
我需要一种C#方法来使用自定义比较操作从List<T>
中删除重复项。在.NET 4中。是否有,还是必须自己写?从列表中删除重复项的C#方法<T>
假设你的比较操作是IEqualityComparer<T>
或可转化为它,你罚款的LINQ:
var newList = oldList.Distinct(customComparer).ToList();
显然,创建一个新的名单而不是删除从老一个元素,但在大多数情况下,这没关系。你总是可以完全用新列表替换旧列表的内容之后,如果不是......
你可以用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);
}
}
}
为什么不做'oldList = oldList.Distinct(customComparer).ToList();'以避免创建一个新列表Mr.Skeet?它不好吗?它不工作吗? – Bastardo
@JohnnyCageWins - 这不会阻止创建新列表,它只会覆盖引用新引用的旧引用。 –
@Jonas H什么?严重吗?我猜想我认为记忆流是非常错误的,因为它会覆盖旧列表。我认为如果我们使用'oldList',就不需要创建了。没有任何方法吗?谢谢Mr.H 。 – Bastardo