gpt4 book ai didi

c# - 如何从值类型 T 的 List> 中删除重复项?

转载 作者:行者123 更新时间:2023-11-30 17:00:19 25 4
gpt4 key购买 nike

这是一个如此简单的问题,肯定已经有人提出并回答了......但我找不到它。

我想使用 LINQ 从值类型列表中删除重复项。我尝试了以下方法:

List<List<int>> a = new List<List<int>>() { new List<int>() { 1, 2, 3 }, new List<int>() { 1, 2, 3 }, new List<int>() { 2, 3, 4 } };
// remove duplicates from a
List<List<int>> b = a.Distinct().ToList(); // this doesn't do it
List<List<int>> c = a.Distinct(new ListKeyComparer<int>()).ToList(); // nor does this

internal class ListKeyComparer<TKey> : IEqualityComparer<List<TKey>>
{
public bool Equals(List<TKey> key1, List<TKey> key2)
{
return String.Join("_", key1).Equals(String.Join("_", key2));
}

public int GetHashCode(List<TKey> key)
{
return key.GetHashCode();
}
}

欢迎所有解决方案!

最佳答案

你想要的是一个 IEqualityComparer对于序列。这不是特别困难。 (请注意,您可以简单地将示例概括为通用的,而不是特定于 int ,并使用 IEnumerable 而不是 List ,因为您不需要特定于功能的列表。

public class SequenceComparer<T> : IEqualityComparer<IEnumerable<T>>
{
private IEqualityComparer<T> comparer;
public SequenceComparer(IEqualityComparer<T> comparer = null)
{
comparer = comparer ?? EqualityComparer<T>.Default;
}
public bool Equals(IEnumerable<T> x, IEnumerable<T> y)
{
return x.SequenceEqual(y, comparer);
}

public int GetHashCode(IEnumerable<T> sequence)
{
unchecked
{
int hash = 19;
foreach (var item in sequence)
hash = hash * 79 + comparer.GetHashCode(item);
return hash;
}
}
}

EqualsSequenceEqual 的形式免费为您提供.唯一剩下要做的有趣的事情是根据序列中的值 创建一个有意义的散列,而不是使用 GetHashCode序列提供自身的方法,因为它通常不会这样做(大多数 IEnumerable ,包括 List ,将它们的哈希码基于对类的引用,而不是其中的值)。

在这种情况下,不需要提供这个SequenceComparer与项目类型的内部比较器(在本例中为 int ),因为默认相等性应该正是您所需要的。如果你有一个 List<List<string>>并且您想比较列表是否相等并对字符串进行不区分大小写的比较,那么您可以使用 new SequenceComparer<string>(StringComparer.InvariantCultureIgnoreCase) .

请注意,连接项目的字符串值并不是比较两个序列的特别安全的方法。这些对象可能没有意义 ToString方法。 (任何不覆盖 ToString 的类型都只会打印出类型名称,这意味着所有内容都将等同于其他所有内容。)您还需要处理冲突情况。例如,如果您有一个生成字符串值 "1_2" 的项目这将被视为等于两个不同的项目,每个项目生成 "1""2" .

关于c# - 如何从值类型 T 的 List<List<T>> 中删除重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22408543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com