gpt4 book ai didi

c# - 如何通过 C# 中的泛型编程来管理这种情况?

转载 作者:太空狗 更新时间:2023-10-30 00:30:24 25 4
gpt4 key购买 nike

我有下面的代码,它在代码的两个位置实现了我需要的逻辑。代码以通用方式编写。

它有一个缺点。它不检查给定对象是否已存在于 collectionToBeExtended 中。它只是添加到它,我将有两倍相同的项目。

我使用此代码管理两个集合,一个包含标签,另一个包含链接实体 (POCO)。它们没有相同的父对象,也没有接口(interface)。为了管理下面的情况,我不想为他们引入一个新的通用接口(interface)。

为了修复上述缺陷,我需要在 foreach 中放置自定义逻辑来检查给定对象是否已经是集合的成员。 Tag 和 Entity 对象不同,所以有共同点可以比较。您可以在下面看到标签实现。

DRY 原则清楚地表明我不应该创建确切的实现,相反我应该创建一些通用的解决方案来处理这两种情况,或者第三种和第四种情况。我的第一个想法是,我引入了一个 switch,我可以在其中放置基于对象类型的自定义逻辑,但 Martin Fowler 在他的 Refactoring 一书中说,switch-case 是有问题的地方。

我目前的知识和经验不足以解决这个问题,所以我非常感谢任何帮助!

通用实现:

private ICollection<T> AddTo<T> ( IEnumerable<T> toBeAdded , ICollection<T> collectionToBeExtended )
{

if ( collectionToBeExtended == null )
{
collectionToBeExtended = new List<T> ( );
}

if ( toBeAdded != null )
{
foreach ( T obj in toBeAdded )
{
collectionToBeExtended.Add(obj);
}
}

return collectionToBeExtended;
}

标签实现:

private ICollection<Tag> AddTo ( IEnumerable<Tag> toBeAdded , ICollection<Tag> collectionToBeExtended )
{

if ( collectionToBeExtended == null )
{
collectionToBeExtended = new List<Tag> ( );
}

if ( toBeAdded != null )
{
foreach ( Tag tag in toBeAdded )
{
if (!collectionToBeExtended.Any(c => c.Id == tag.Id && c.Name == tag.Name))
{
collectionToBeExtended.Add(tag);
}
}
}

return collectionToBeExtended;
}

最佳答案

C#中的所有类型都可以等同于x.Equals(y) .如果需要,您可以覆盖此等式。

我只会使用 IEnumerable<A>解决这个问题。如果你想要 ICollection<A>然后你可以从 IEnumerable<A> 构造一个集合.

collectionToBeExtended.Concat(toBeAdded).Distinct()

关于c# - 如何通过 C# 中的泛型编程来管理这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36956517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com