从c#中的列表<object>列表中删除重复的内部列表

Vah*_*hid 2 c# list

我为这个含糊不清的标题道歉.我不能同时保持清晰和简洁.所以随时改变它.

我有一个很大的列表,其中包含其他几个列表.这些内部列表包含Column对象.

List<List<Column>> listOfAllColumns;
Run Code Online (Sandbox Code Playgroud)

假设我的内部列表包含不同的Column对象,如下所示:

list1 = {c1, c1, c2}
list2 = {c1, c2, c1}
list3 = {c2, c3}
list4 = {c1,c1, c2}
Run Code Online (Sandbox Code Playgroud)

大列表包含以下列表:listOfAllColumns = {list1,list2,list3,list4}

现在我想要一个从listOfAllColumns列表中删除重复列表的方法.例如,它将查看上面的列表并删除list4.

list1: c1,c1,c2
list2: c1,c2,c1
list3: c2,c3
list4: c1,c1,c2 (it is equal to list1 so it is a duplicate)
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

public class ColumnList
{
    public void RemoveDuplicateColumnTypes()
    {

        Column c1 = new Column() { SectionName = "C50", StirrupType = "Tie" };
        Column c2 = new Column() { SectionName = "C50", StirrupType = "Spiral" };
        Column c3 = new Column() { SectionName = "C40", StirrupType = "Tie" };


        List<Column> list1 = new List<Column>() { c1, c1, c2 };
        List<Column> list2 = new List<Column>() { c1, c2, c1 };
        List<Column> list3 = new List<Column>() { c2, c3 };
        List<Column> list4 = new List<Column>() { c1, c1, c2 };


        List<List<Column>> listOfAllColumns = new List<List<Column>>() { list1, list2, list3, list4 };

        var result = listOfAllColumns.Distinct();

    }
}

class Column
{
    public string SectionName;
    public string StirrupType;
    public int StirrupSize;
    public double StirrupSpacing;
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,顺序很重要,例如{c1,c2,c1}与{c2,c1,c1}不同.

Ser*_*rvy 5

你需要的IEqualityComparer是能够比较不同序列的东西.这并不是特别难,因为它还有一种比较其中项目的方法:

public class SequenceComparer<T> : IEqualityComparer<IEnumerable<T>>
{
    private IEqualityComparer<T> comparer;
    public SequenceComparer(IEqualityComparer<T> comparer = null)
    {
        this.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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您需要做的就是创建一个IEqualityComparer<Column>能够比较两个列对象(通过您想要的任何有意义的方式,可能是默认实现是不够的).

然后你可以把它们传递给Distinct:

var query = listOfAllColumns.Distinct(
    new SequenceComparer<Column>(new ColumnComparer()));
Run Code Online (Sandbox Code Playgroud)