номер
Если вы посмотрите на оригинальные методы расширения в LINQ, все они используют IEnumerable<T>
интерфейс. Если вы используете общие коллекции, этого должно быть достаточно. Однако ваш метод Replace пропускает параметр для заменяемых элементов. Вы должны сделать что-то вроде этого:
public static IEnumerable<TSource> Replace<TSource>(this IEnumerable<TSource> source, IEnumerable<TSource> oldItems, IEnumerable<TSource> newItems)
{
return source.Except(oldItems).Union(newItems);
}
public static IEnumerable<TSource> Replace<TSource>(this IEnumerable<TSource> source, IEnumerable<TSource> oldItems, IEnumerable<TSource> newItems, IEqualityComparer<TSource> comparer)
{
return source.Except(oldItems, comparer).Union(newItems);
}
Обновление
Вот метод OverWrite, который я мог бы придумать:
public static IEnumerable<TSource> OverWrite<TSource, TSelectItem>(this IEnumerable<TSource> source, IEnumerable<TSource> newItems, Func<TSource, TSelectItem> selectProperty) where TSource : class
{
IEnumerable<TSource> result = source;
if (newItems != null)
{
result = source.Select(s => newItems.FirstOrDefault(n => EqualityComparer<TSelectItem>.Default.Equals(selectProperty(s), selectProperty(n))) ?? s);
}
return result;
}
public static IEnumerable<TSource> OverWrite<TSource, TSelectItem>(this IEnumerable<TSource> source, IEnumerable<TSource> newItems, Func<TSource, TSelectItem> selectProperty,IEqualityComparer<TSelectItem> propertyComparer) where TSource : class
{
IEnumerable<TSource> result = source;
if (newItems != null)
{
result = source.Select(s => newItems.FirstOrDefault(n => propertyComparer.Equals(selectProperty(s), selectProperty(n))) ?? s);
}
return result;
}
Вы можете использовать это так:
someObjects.OverWrite(newObjects, item => item.ID);
someObjects.OverWrite(newObjects, item => item.ID, new PropertyComparer());