如何在列表<t>中保留一个重复的条目

时间:2015-12-01 09:29:34

标签: c# asp.net asp.net-web-api .net-4.5

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

我已经尝试了很多东西,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++;
                }
            }
        }

2 个答案:

答案 0 :(得分:2)

还有另一个不同的LINQ扩展方法重载,它也需要IEqualityComparer作为参数(请参阅此link)。因此,您需要创建一个实现IEqualityComparer<Bookings>的类,并将其实例提供给Distinct方法。这样,您不需要覆盖该类型的Equals方法。

有关两个对象是否彼此相等的规则在EqualityComparer中实现。

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

答案 1 :(得分:0)

按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();
        }
    }