在C#中的列表列表中删除重复的列表

时间:2019-02-06 10:18:55

标签: 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};

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

2 个答案:

答案 0 :(得分:5)

更新:如评论中所述,项的顺序无关紧要,因此{3,2,1}{1,2,3}被视为重复项。


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

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

您可以使用Distinct和EqualityComparer界面

TSelf

平等比较器的实现。

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; } } Equals,则可以为您的商品创建另一个相等比较器,并将其传递给该相等比较器。

GetHashCode

其中mainList = mainList.Distinct(new ListEqualityComparer<object>(myItemEqualityComparer)).ToList(); 用于比较您的myItemEqualityComparer

答案 1 :(得分:0)

尝试遵循linq uery

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

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

var distinctlist = mainList.Select(o => { var t = o.OrderBy(x=>x).Select(i => i.ToString()); return new {Key= string.Join("", t),List=o}; }).
                                GroupBy(o=>o.Key).
                                Select(o=>o.FirstOrDefault()).
                                Select(o=>o.List);