我有一个列表,在列表中有多个条目。如果列表包含重复的条目,那么我只想保留其中一个副本。
我已经尝试了很多东西,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++;
}
}
}
答案 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();
}
}