【问题标题】:Find the delta between two differently typed lists查找两个不同类型列表之间的增量
【发布时间】:2014-01-02 14:04:58
【问题描述】:

我正在尝试获取两个不同类型的列表之间的差异,我有一个比较器,而不是遍历这两个列表,不包括另一个列表中的项目。
该方法最好是可重复使用且易于阅读的。

我想了一些 linq except 方法,但是对于两种类型和一个比较器没有重载。

我所希望的(编造的代码):

var fromDatabase = new List<T1>();
var fromUI = new List<T2>();

var comparer = new MyComparer();
var theThing = new TheThing<T1,T2>(fromDatabase, fromUI, comparer)

var newOnes = theThing.Two.Where(o=>o.other == null);
var removedOnes = theThing.One.Where(o=>o.other == null);

这将封装我的比较逻辑,我希望通过删除一些枚举来清理我的代码。

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    T1 的列表映射到T2 的列表,反之亦然(您可以为此使用AutoMapper)。然后简单的Except 就可以完成这项工作。

    Mapper.CreateMap<T2, T1>(); // create map on application startup
    
    var fromDatabase = new List<T1>();
    var fromUI = new List<T2>();
    var entitiesFromUI = Mapper.Map<List<T1>>(fromUI); // convert T2 list to T1 list
    var newOnes = entitiesFromUI.Except(fromDatabase);
    var removedOnces = fromDatabase.Except(entitiesFromUI);
    

    注意:你应该为你使用的类型实现 Equals 和 GetHashCode,否则实体将通过引用进行比较,这不会给出预期的结果,因为 mapper 在映射过程中会创建新的实例。

    【讨论】:

    • Sergey 也许一个“简单”的例子会更好
    • 如果在任一方向都没有可用的映射功能,这是不可能的。例如,如果 1 == "true"、2 == "true" 和 2 == "unknown" 对于比较器都成立......
    • 或将T1T2 都映射到一个类型,该类型描述了他的比较器所处理的公共属性。
    • @Alexander 抱歉,没听懂。正如我从问题中了解到的那样,OP 有来自数据库的实体和一些映射到 ui 的 dto,它们代表相同的实体(否则添加和删除没有意义)
    • @BorisCallens 在不了解 T1 和 T2 详细信息(以及您的比较器详细信息)的情况下,我无法理解或解决您的问题。我对数据库实体和 dtos 经常使用相同的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    • 2018-05-29
    相关资源
    最近更新 更多