c# - 删除 C# 中列表列表中的重复列表

标签 c# linq

如何从主列表中删除重复的内部列表?

var list1 = new List<object>() { 1,2,3 };
var list2 = new List<object>() { 4,5,6 };
var list3 = new List<object>() { 1,2,3 };

List<List<object>> mainList = new List<List<object>>() {list1, list2, list3};

我想从 mainList 中删除 list3,以便 mainList 中没有重复项。

最佳答案

更新:正如评论中提到的,项目的顺序并不重要,所以 {3,2,1}{1,2,3}被认为是重复的。

<小时/>

您的问题有一些疑虑。你的内部列表包含对象。如果这意味着对象可以是任何东西而不仅仅是 int那么你应该确保这些对象覆盖 EqualsGetHashCode (或实现 IEquatable<TSelf>,其中 TSelf 是实现类型)。

如果您的内部列表仅包含原始类型或常见只读结构(例如 DateTime 或 TimeSpan),那么您不必担心。

您可以使用 Distinct 和 EqualityComparer 接口(interface)

var list1 = new List<object>() { 1, 2, 3 };
var list2 = new List<object>() { 4, 5, 6 };
var list3 = new List<object>() { 1, 2, 3 };

List<List<object>> mainList = new List<List<object>>() { list1, list2, list3 };

mainList = mainList.Distinct(ListEqualityComparer<object>.Default).ToList();

相等比较器的实现。

public class ListEqualityComparer<T> : IEqualityComparer<List<T>>
{
    private readonly IEqualityComparer<T> _itemEqualityComparer;

    public ListEqualityComparer() : this(null) { }

    public ListEqualityComparer(IEqualityComparer<T> itemEqualityComparer)
    {
        _itemEqualityComparer = itemEqualityComparer ?? EqualityComparer<T>.Default;
    }

    public static readonly ListEqualityComparer<T> Default = new ListEqualityComparer<T>();

    public bool Equals(List<T> x, List<T> y)
    {
        if (ReferenceEquals(x, y)) return true;
        if (ReferenceEquals(x, null) || ReferenceEquals(y, null)) return false;
        return x.Count == y.Count && !x.Except(y, _itemEqualityComparer).Any();
    }

    public int GetHashCode(List<T> list)
    {
        int hash = 17;
        foreach (var itemHash in list.Select(x => _itemEqualityComparer.GetHashCode(x))
                                     .OrderBy(h => h))
        {
            hash += 31 * itemHash;
        }
        return hash;
    }
}

如果您的对象没有覆盖 EqualsGetHashCode您还可以为您的项目创建另一个相等比较器并将其传递给此相等比较器。

mainList = mainList.Distinct(new ListEqualityComparer<object>(myItemEqualityComparer)).ToList();

哪里myItemEqualityComparer用于比较您的object

关于c# - 删除 C# 中列表列表中的重复列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54551181/

相关文章:

c# - 在列表对象中排序

c# - 返回匿名类型的简单方法(使使用 LINQ 的 MVC 成为可能)

c# - 在 ASP.NET 中将电子邮件发送给带有丹麦语字符的收件人

c# - .NET Core 如何获取环境变量?

c# - 有 8 位字符的字符串类型吗?

c# - 在C#中添加两个不同长度的列表

c# - 阻止 .NET 使用 "lifting"局部变量

c# - 在 LINQ 的 where 子句中使用 .NET 字符串函数

Linq to NHibernate 在一次请求中生成 3,000 多个 SQL 语句!

c# - 根据条件删除具有多个id的记录