IEnumerable是否是?更换不好的设计?
我创建了以下扩展方法。 这是一个糟糕的设计吗?我应该为 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);
}
更新:我认为命名有点错误。我想要这个函数做的是添加并覆盖。 更新:向 Union 添加了比较器。
I have created the following extension-methods.
Is this a bad design? Should I do this for ICollection instead?
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);
}
Update: I think the naming is little wrong. Want I want this function to do is Add with Overwrite.
Update: Added comparer to Union.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您拥有的简化逻辑操作是
当您采用
source.Except(newItems).Union(newItems)
时,您将采用source
中的所有不同项目,但中的任何项目除外code>newItems
,然后添加newItems
中的所有不同项目。这就是Union
所做的!获取newItems
的所有不同项目,并将来自source
的尚不存在的不同项目添加到其中。您可以使用不同的名称
AddWithOverwrite
、AddWithReplace
等来调用它,这些名称将错误(没有任何内容被添加到任何内容中,源和 newItems 都没有以任何方式修改),但操作本身不必像代码那样复杂。有一些权衡。通过上述方法,所有
newItems
都将出现在source
之前。计数器是您已经丢失了替换商品的订单。The simplified logical operation you have is
When you take
source.Except(newItems).Union(newItems)
, you take all the distinct items insource
, except any item innewItems
, and then add in all the distinct items innewItems
. That's whatUnion
does! Take all the distinct items ofnewItems
and add to it the distinct items fromsource
that do not already exist.You can call it by a different name
AddWithOverwrite
,AddWithReplace
, etc., and those names would be wrong (nothing is being added to anything, neither the source nor newItems are modified in any way), but the operation itself needn't be as complicated as your code makes it.There are tradeoffs. With the approach above, all of the
newItems
will come before thesource
. The counter is that you've already lost ordering with the replaced items.不。
如果您查看 LINQ 中的原始扩展方法,它们都使用
IEnumerable
接口。如果您使用通用集合,这应该足够了。但是,您的 Replace 方法缺少要替换的成员的参数。你应该这样做:更新
这是我可以想出的 OverWrite 方法:
你可以像这样使用它:
No.
If you look at the original extension methods in LINQ, they all use
IEnumerable<T>
interface. If you are using generic collections, it should be enough. However your Replace method misses a parameter for members to be replaced. You should do something like this:Update
Here's the OverWrite method I could come up with:
You can use it like this: