【问题标题】:Compare Elements in two lists and return a separate list of the original list that is different比较两个列表中的元素并返回不同的原始列表的单独列表
【发布时间】:2016-09-08 14:51:58
【问题描述】:

我有一个包含以下字段的类。

    class StandardizedModel
    {
        public string Case{ get; set; }
        public DateTime? CreatedDateLocal { get; set; }
        public DateTime? ClosedDateLocal { get; set; }
        private string _status;
    }

假设我用这个自定义类创建了两个列表。

List1(主列表)

列表2

我要做的是比较两个列表中的元素,如果它们不同,我需要从 list1 返回原始的 StandardizedModel。

这两个列表的大小将始终相同,并且案例将始终存在于两个列表中,但日期和状态可能不同。

我尝试使用 linq 的 zip 来尝试比较元素,然后将它们添加到列表中,但返回 0。

List<StandardizedModel> testList = new List<StandardizedModel>();

            var test = List1.Zip(List2, (a, b) =>
            {
                if (a =! b) { testList.Add(a);}
                return testList;
            });

【问题讨论】:

  • ... 到目前为止,您能向我们展示您的代码吗?
  • " 如果它们不同,我需要从 list1 返回原始的 StandardizedModel" 如果它们相同,你会返回什么?那你不是总是从list1返回项目吗?
  • 添加了一些我一直在尝试让它工作的示例代码。
  • @itsme86,如果它们相同,我不需要知道,所以我只是丢弃它。如果它们不同,那么我需要在其上运行更多代码。
  • 并且案例将始终存在于两个列表中,但日期和状态可能不同。.. 所以案例可以存在,但这并不'并不意味着它们将是相同的。那么,Case 是否有可能与日期和状态不同?

标签: c# linq


【解决方案1】:

您可以使用Enumerable.Join,即efficient

var changes = from m1 in list1
              join m2 in list2 on m1.Case equals m2.Case
              where  m1.CreatedDateLocal != m2.CreatedDateLocal
                ||   m1.ClosedDateLocal  != m2.ClosedDateLocal
                ||   m1._status != m2._status
              select m1;
List<StandardizedModel> changeList = changes.ToList();

【讨论】:

  • 这将完成任务,但它不是正确的方法,除非它是一个永远不必在其他任何地方重复使用的丢弃物。
  • 正确的方法。当然,您始终可以覆盖Equals 或使用自定义IEqualityComparer&lt;T&gt;。但这对于这项特殊任务来说不是必需的。实际上,Equals 似乎只会比较 Case 而不会比较其他属性。它有效,可读且高效。怎么了,真的值得投反对票吗?
  • 如果这是“正确的”,以后如何在不复制和粘贴此代码的情况下在另一个位置重复使用?这如何遵守 DRY(不要重复自己)最佳实践?
  • 为什么你认为这种特殊情况必须在其他地方重复使用?如果是这样,请将其移动到一个方法中并调用它。这是一个“平等的案例,但在标准化模型中其他事情不同” - 用例。你到处都需要的东西......不是真的
  • 好吧,我想它的更多情况,两者都是可行的答案,并且根据情况都是更好的答案。我将取消我的反对票,因为在一次性情况下,它是一个快速简洁的答案。我还更新了我的答案以反映具体情况。
【解决方案2】:

您最好的选择代码重用性是覆盖对象的相等实现,以便您可以确定它们是否以您想要的方式相等,如果您尝试在一个默认情况下,对象是引用,这意味着它们是否指向相同的内存位置。如果它们是 2 个单独的实例,则永远不会出现这种情况。 (这就是你的 zip 不起作用的原因)然后你可以使用你的 zip 来创建你的列表。

【讨论】:

  • 除了 “这就是你的 zip 不工作的原因”Zip 是错误的方法,因为它只通过每个元素的索引链接两个序列。
  • @TimSchmelter 集合操作Zip的定义是:对两个序列的对应元素应用一个指定的函数,产生一个序列的结果。这使我原来的陈述正确。
  • MSDN: "该方法将第一个序列的每个元素与第二个序列中具有相同索引的元素合并。如果序列没有相同数量的元素,则该方法合并序列,直到它到达其中一个的末尾。" 它与从两个序列中相同索引处访问元素的 for 循环相同。它与物品是否相等无关。
  • @TimSchmelter 是的,就是再往下,最终将函数应用于每个元素,如果序列id相同,则合并2条记录,这样就没有重复了。在这种情况下,他试图根据 a 和 b 的引用相等性将某些内容“添加”到列表中,这永远不会相等。这就是为什么我说即使 Zip 是正确的方法,它也行不通。如果他有一个覆盖的相等性来使用对象中的值属性,他的 zip 就可以工作。
猜你喜欢
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 2019-12-07
相关资源
最近更新 更多