如何保留列表中的重复条目之一<T>

How to keep one of duplicate entries in list<T>

我有一个列表,列表中有多个条目。如果列表包含一个重复的条目,那么我只想保留一个重复项。

我已经尝试了很多东西,list.Distinct().ToList() 并且这不会删除重复的条目,我不想覆盖 类 Equals 方法,所以有没有其他方法.

我也做了这个方法,似乎又一次,没有删除重复的条目,因为它不考虑对象 a == 对象 b。

private void removeDupes(List<Bookings> list)
        {
            int duplicates = 0;
            int previousIndex = 0;

            for (int i = 0; i < list.Count; i++)
            {
                bool duplicateFound = false;
                for (int x = 0; x < i; x++)
                {
                    if (list[i] == list[x])
                    {
                        duplicateFound = true;
                        duplicates++;
                        break;
                    }
                }
                if (duplicateFound == false)
                {
                    list[previousIndex] = list[i];
                    previousIndex++;
                }
            }
        }

Distinct LINQ 扩展方法的另一个重载也采用 IEqualityComparer as an argument (see this link)。因此,您需要创建一个实现 IEqualityComparer<Bookings> 的 class 并将其实例提供给 Distinct 方法。这样,您就不需要重写该类型的 Equals 方法。

EqualityComparer 实现了两个对象是否相等的规则。

作为替代方案,您可以使用 HashSet 并在构造函数中提供 EqualityComparer。

按照 Markus 回答的顺序,您的问题的可能解决方案可能如下所示:

public class Booking
    {
        public Booking(int id, float amount)
        {
            BookingId = id;
            BookingAmount = amount;
        }

        public int BookingId { get; }
        public float BookingAmount { get; }
    }

    public class BookingComparer : IEqualityComparer<Booking>
    {
        public bool Equals(Booking x, Booking y)
        {
            return (x.BookingAmount == y.BookingAmount) && (x.BookingId == y.BookingId);
        }

        public int GetHashCode(Booking obj)
        {
            return obj.BookingId.GetHashCode()*17 + obj.BookingAmount.GetHashCode()*17;
        }
    }

    internal class Program
    {
        private static void Main(string[] args)
        {
            var booking1 = new Booking(1, 12);
            var booking2 = new Booking(1, 12);

            var bookings = new List<Booking>();
            bookings.Add(booking1);
            bookings.Add(booking2);

            var result = bookings.Distinct(new BookingComparer()).ToList();
        }
    }