C# 是可数的<;T>;替换糟糕的设计?

C# 是可数的<;T>;替换糟糕的设计?,c#,linq,extension-methods,ienumerable,C#,Linq,Extension Methods,Ienumerable,我创建了以下扩展方法。 这是一个糟糕的设计吗?我应该为ICollection执行此操作吗 public static IEnumerable<TSource> Replace<TSource>(this IEnumerable<TSource> source, IEnumerable<TSource> newItems) { return source.Except(newItems).Union(newItems); } public

我创建了以下扩展方法。 这是一个糟糕的设计吗?我应该为ICollection执行此操作吗

public static IEnumerable<TSource> Replace<TSource>(this IEnumerable<TSource> source, IEnumerable<TSource> newItems)
{
    return source.Except(newItems).Union(newItems);
}

public static IEnumerable<TSource> Replace<TSource>(this IEnumerable<TSource> source, IEnumerable<TSource> newItems, IEqualityComparer<TSource> comparer)
{
    return source.Except(newItems, comparer).Union(newItems, comparer);
}
公共静态IEnumerable替换(此IEnumerable源,IEnumerable newItems)
{
返回源.Except(newItems).Union(newItems);
}
公共静态IEnumerable替换(此IEnumerable源、IEnumerable newItems、IEqualityComparer比较器)
{
返回source.Except(newItems,comparer).Union(newItems,comparer);
}
更新:我认为命名有点错误。我想让这个函数做的是添加覆盖。 更新:将比较器添加到Union。

如果您查看LINQ中的原始扩展方法,它们都使用
IEnumerable
接口。如果您使用的是泛型集合,那么就足够了。但是,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);
}
someObjects.OverWrite(newObjects, item => item.ID);
someObjects.OverWrite(newObjects, item => item.ID, new PropertyComparer());

您的简化逻辑操作是

 return newItems.Union(source);
 return newItems.Union(source, comparer);
当您获取
source.Except(newItems).Union(newItems)
时,您获取
source
中除
newItems
中的任何项目以外的所有不同项目,然后在
newItems
中添加所有不同项目。这就是工会所做的!获取
newItems
的所有不同项,并将
source
中不存在的不同项添加到其中

您可以用不同的名称调用它,
AddWithOverwrite
AddWithReplace
,这些名称可能是错误的(没有任何内容被添加到任何内容中,也没有以任何方式修改源项或新项),但操作本身不必像代码那样复杂


这是一种权衡。使用上述方法,所有
新项
都将位于
之前。计数器是您已经失去了对替换项的排序。

第一个选项仅对等式定义不正确的类型有用。只是一个观察。。。这不是真正的“替换”,是吗?更多的“添加”或“扩展”?另外,Except()不是多余的吗?是的。如果你要更换一些东西,你需要一些旧的东西来更换。它将类似于源。除了(旧项)。联合(新项)可能是名称不正确。更像是“添加并覆盖”。如果从原始序列中获取相同的对象,然后再将其添加回,则不执行任何操作。是的,这更像是“替换”。然而,我认为我的方法的命名是错误的。我想用覆盖添加。如果你要用相同的对象覆盖,将不会有多大帮助。。。你到底想覆盖什么?你是对的。但是我们破坏了ower对象中的相等定义。我想删除并添加新对象。我无法理解。能否指定要删除的对象?
 return newItems.Union(source);
 return newItems.Union(source, comparer);