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

标签 c# list

我为这个模棱两可的标题道歉。我无法同时保持清晰和简洁。所以请随意更改它。

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

List<List<Column>> listOfAllColumns;

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

list1 = {c1, c1, c2}
list2 = {c1, c2, c1}
list3 = {c2, c3}
list4 = {c1,c1, c2}

大列表包含这些列表: 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)

这是我的代码:

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

顺便说一句,顺序很重要,例如 {c1, c2, c1} 不同于 {c2,c1,c1}。

最佳答案

您需要的是 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;
        }
    }
}

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

然后您可以将它们传递给 Distinct :

var query = listOfAllColumns.Distinct(
    new SequenceComparer<Column>(new ColumnComparer()));

关于c# - 从 c# 中的 list<object> 列表中删除重复的内部列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22208491/

相关文章:

c# - 如何从 Windows Phone 网络浏览器控件隐藏 html 元素

c# - Google Speech Api 从返回 {"result":[]} in C# 的音频文件中获取文本

list - 2个列表的交集和并集

python - 查找字符和数字之间可能的双射

java - 从 Java 字符串列表中跟踪回文

c# - 使用 Xamarin.Forms 和 Xamarin Studio 的基本存储

c# - 从属性的 getter 调用方法

c# - 无法构造 String 类型。您必须配置容器以提供此值

java - 使用 java 和 jdom 从大型 csv 文件创建 XML 文件

Java lambda : combine doSomething() and removeIf() in one iteration