在C#中的列表列表中删除重复的列表 [英] Remove duplicate lists inside a list of lists in C#

查看:69
本文介绍了在C#中的列表列表中删除重复的列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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}被视为重复项. /p>


关于您的问题,有一些担忧.您的内部列表包含对象.如果这意味着对象可以是任何东西,而不仅仅是int,则应确保这些对象也覆盖EqualsGetHashCode(或实现IEquatable<TSelf>,其中TSelf是实现类型).

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

您可以使用Distinct和EqualityComparer界面

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 s

How do I remove duplicate inner lists from main list?

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};

I want to remove the list3 from the mainList so that no duplicates in the mainList.

解决方案

Update: as mentioned in comments, order of items does not matter so {3,2,1} and {1,2,3} are considered duplicate.


There are a few concerns about your question. your inner list contains objects. if that means object can be anything and not just an int then you should make sure those objects override Equals and GetHashCode as well (or implement IEquatable<TSelf> where TSelf is the implementing type).

If your inner list just contains primitive types or common readonly structs such as DateTime or TimeSpan then you shouldn't worry.

You can use Distinct and 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();

Equality comparer implementation.

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;
    }
}

If your objects does not override Equals and GetHashCode you can make another equality comparer for your items as well and pass it to this equality comparer.

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

where myItemEqualityComparer is for comparing your objects

这篇关于在C#中的列表列表中删除重复的列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆