Tôi đã tạo phương thức tiện ích mở rộng chỉ thêm các giá trị duy nhất cho bất kỳ điều gì triển khai ICollection<T>
(bao gồm List<T>
) từ một số IEnumerable<T>
. Không giống như các triển khai sử dụng List<T>.Contains()
, phương pháp này cho phép bạn chỉ định biểu thức lambda xác định hai mục có giống nhau hay không.
/// <summary>
/// Adds only items that do not exist in source. May be very slow for large collections and some types of source.
/// </summary>
/// <typeparam name="T">Type in the collection.</typeparam>
/// <param name="source">Source collection</param>
/// <param name="predicate">Predicate to determine whether a new item is already in source.</param>
/// <param name="items">New items.</param>
public static void AddUniqueBy<T>(this ICollection<T> source, Func<T, T, bool> predicate, IEnumerable<T> items)
{
foreach (T item in items)
{
bool existsInSource = source.Where(s => predicate(s, item)).Any();
if (!existsInSource) source.Add(item);
}
}
Cách sử dụng:
source.AddUniqueBy<Foo>((s, i) => s.Id == i.Id, items);
Nguồn
2015-10-05 03:46:23
tôi có các đối tượng trùng lặp trong bộ sưu tập của tôi. Đơn giản chỉ cần list = list.Distinct(). ToList(); không hoạt động. – wotney
Riêng biệt sẽ loại bỏ các đối tượng trùng lặp. Nếu các đối tượng của bạn không thực sự giống nhau, bạn phải làm cho các đối tượng của bạn thực hiện Equals() và GetHashCode() – ivowiblo