通过值从KeyValuePair列表中删除重复项

4

我有一个C#中的KeyValuePair列表,格式为KeyValuePair<long, Point>

我想从列表中删除具有重复值的项。

Point对象具有{X,Y}坐标。

样例数据:

List<KeyValuePair<long, Point>> Data= new List<KeyValuePair<long,Point>>();
Data.Add(new KeyValuePair<long,Point>(1,new Point(10,10)));
Data.Add(new KeyValuePair<long,Point>(2,new Point(10,10)));
Data.Add(new KeyValuePair<long,Point>(3,new Point(10,15)));

期望输出:

1,(10,10)    
3,(10,15)

5
你有尝试过什么吗? - Kunal Mukherjee
嗨Kunal,我尝试了下面的链接但没有成功。https://stackoverflow.com/a/13698224/7300644 - Sandeep Jadhav
2
没有什么魔法。您需要 (1) 通过 (2) 迭代旧列表来 (3) 构建新列表,同时识别重复数据。 - Pressacco
嗨,Pressacco,我想要一个Linq解决方案。我知道迭代是最简单的方法,但想知道是否可以使用Linq解决。 - Sandeep Jadhav
这个回答解决了你的问题吗?使用LINQ删除重复记录 - Pressacco
2个回答

5
你可以在一行代码中实现此操作:
``` var result = Data.GroupBy(x => x.Value).Select(y => y.First()).ToList(); ```

1
感谢Maahi的回复。 - Sandeep Jadhav

0

实现IEqualityComparer<T>以提供不同的结果,同时我重构了您的代码,使用POCO来提高可维护性 -

using System;
using System.Collections.Generic;
using System.Linq;
using System.Drawing;

namespace TestApp
{
    public class PointKVP
    {
        public long Id { get; set; }
        public Point Point { get; set; }

        public override string ToString()
        {
            return $"{Id},({Point.X}, {Point.Y})";
        }
    }

    public class PointKVPEqualityComparer : IEqualityComparer<PointKVP>
    {
        public bool Equals(PointKVP x, PointKVP y)
        {
            if (x.Point.X == y.Point.X && x.Point.Y == y.Point.Y)
            {
                return true;
            }
            else if (x.Point == default(Point) && y.Point == default(Point))
            {
                return true;
            }
            else if (x.Point == default(Point) || y.Point == default(Point))
            {
                return false;
            }
            else
            {
                return false;
            }
        }

        public int GetHashCode(PointKVP obj)
        {
            return (int)obj.Point.X ^ obj.Point.Y;
        }
    }

    public class Program
    {
        public static void Main(string[] args)
        {
            List<PointKVP> Data = new List<PointKVP>
             {
                new PointKVP
                {
                    Id = 1,
                    Point = new Point(10,10)
                },
                new PointKVP
                {
                    Id = 2,
                    Point = new Point(10,10)
                },
                new PointKVP
                {
                    Id = 3,
                    Point = new Point(10,15)
                }
             };

            Data.Distinct(new PointKVPEqualityComparer()).ToList().ForEach(Console.WriteLine);
        }
    }
}

这会给出 -

1,(10, 10)
3,(10, 15)

1
感谢Kunal的努力。 - Sandeep Jadhav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接