Utworzono metodę rozszerzenia, która dodaje tylko unikalne wartości do niczego implementującego ICollection<T>
(w tym List<T>
) z IEnumerable<T>
. W przeciwieństwie do implementacji, które używają List<T>.Contains()
, ta metoda pozwala określić wyrażenie lambda, które określa, czy dwa elementy są takie same.
/// <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);
}
}
Zastosowanie:
source.AddUniqueBy<Foo>((s, i) => s.Id == i.Id, items);
mam duplikaty obiektów w mojej kolekcji. Po prostu list = list.Distinct(). ToList(); nie działa. – wotney
Distinct usunie duplikaty obiektów. Jeśli twoje obiekty nie są w rzeczywistości takie same, musisz sprawić, żeby twoje obiekty zaimplementowały Equals() i GetHashCode() – ivowiblo