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