将一个集合与另一个集合进行比较(从架构上来说)的更好方法是什么?

发布于 2024-08-22 00:52:35 字数 1502 浏览 10 评论 0原文

以下是我目前最喜欢的架构方法的示例:

public abstract class CollectionComparer {
    public virtual SetEqual(IEnumerable enum1, IEnumerable enum2) {
        if(enum1== null && enum2== null)
            return true;

        if(enum1== null && !(enum2== null))
            return false;

        if(!(enum1== null) && enum2== null)
            return false;

        if(enum1.GetType().DeclaringType != enum2.GetType().DeclaringType)
            return false;

        var col1 = (from e in enum1 select e).ToList()
        var col2 = (from e in enum2 select e).ToList()

        if(col1.Count != col2.Count)
            return false;           

        foreach (element in col1)
            if(!col2.Contains(element))
                return false;

        foreach (element in col2)
            if(!col1.Contains(element))
                return false;

        return true; 
    }
}

public interface IProduct {
    ...
}

public interface IOrder {
    ...
    ICustomer Customer { get; }
    ICollection<IProduct> Products { get; }
}

public interface ICustomer {
    ...
    ICollection<IOrder> Orders { get; }
}

public internal Order : CollectionComparer, IOrder {
    #region IOrder interface implementation
    ...
    #endregion
}

public internal Customer : CollectionComparer, ICustomer {
    #region ICustomer interface implementation
    ...
    #endregion
}

对于应用于集合的与 object.Equals() 等效的集合比较,此 CollectionComparer 抽象类方法是否会被视为良好实践?

Here's an example of the architecture approach I favorited as for now:

public abstract class CollectionComparer {
    public virtual SetEqual(IEnumerable enum1, IEnumerable enum2) {
        if(enum1== null && enum2== null)
            return true;

        if(enum1== null && !(enum2== null))
            return false;

        if(!(enum1== null) && enum2== null)
            return false;

        if(enum1.GetType().DeclaringType != enum2.GetType().DeclaringType)
            return false;

        var col1 = (from e in enum1 select e).ToList()
        var col2 = (from e in enum2 select e).ToList()

        if(col1.Count != col2.Count)
            return false;           

        foreach (element in col1)
            if(!col2.Contains(element))
                return false;

        foreach (element in col2)
            if(!col1.Contains(element))
                return false;

        return true; 
    }
}

public interface IProduct {
    ...
}

public interface IOrder {
    ...
    ICustomer Customer { get; }
    ICollection<IProduct> Products { get; }
}

public interface ICustomer {
    ...
    ICollection<IOrder> Orders { get; }
}

public internal Order : CollectionComparer, IOrder {
    #region IOrder interface implementation
    ...
    #endregion
}

public internal Customer : CollectionComparer, ICustomer {
    #region ICustomer interface implementation
    ...
    #endregion
}

Would this CollectionComparer abstract class approach be considered a good practice for collection comparison for an equivalent to object.Equals() applied to a collections?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

御弟哥哥 2024-08-29 00:52:35

如何实现 IComparable 并为每个项目和每个项目属性递归调用它?已经有一个定义良好的接口来比较对象。有什么原因您不想/不能使用它吗?

How about implementing IComparable and calling it recursively for each item and each item property? There's already a well-defined interface to compare objects. Is there some reason you don't want to/can't use it?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文