根据特定列从列表中删除重复行

时间:2017-08-09 18:48:27

标签: c#

我认为这与docs on using encrypted files here类似,但我无法应用相同的解决方案。

我有一个包含多个列的列表:

    public struct InfoForGraph
    {
        public float a{ get; set; }
        public double b{ get; set; }
        public double c { get; set; }
        public double d { get; set; }
        public double e { get; set; }
        public double f { get; set; }
        public double g { get; set; }
        public double h { get; set; }
        public double i { get; set; }
        public double j { get; set; }
    }

我想从此列表中删除重复的行,但仅在特定字段匹配时删除。如果我对整个表格做了不同的处理,这些行将不会被删除。另外,我不关心重复的线条,我只想保留其中一条。

输入:

2.67|1.84|420|400|1608039|808|3117|1|2|3|4
2.68|1.84|420|401|1608039|808|3269|1|2|3|4

预期输出:

2.67|1.84|420|400|1608039|808|3117|1|2|3|4

因此,如果列1,2,5,6,8,9,10具有相同的值,我应该只保留第一个返回(删除第2个,第3个,所有这些字段都匹配。)

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

为简单起见,如果InfoForGraph.bInfoForGraph.c相等,我会缩小您的条件,说明两个对象相等。您明白并改变您的比较器等。

public class InfoComparer : IEqualityComparer<InfoForGraph>
{
    public bool Equals(InfoForGraph x, InfoForGraph y)
    {
        if (x.b == y.b && x.c == y.c)
            return true;
        else
            return false;
    }

    public int GetHashCode(InfoForGraph obj)
    {
        unchecked
        {
            int hash = 17;
            hash = hash * 23 + obj.b.GetHashCode();
            hash = hash * 23 + obj.c.GetHashCode();
            return hash;
        }
    }
}

然后在其上拨打Distinct()

var unique = list.Distinct(new InfoComparer());