【问题标题】:C# Compare two lists, return the new items in listC#比较两个列表,返回列表中的新项目
【发布时间】:2019-11-30 22:03:17
【问题描述】:

我有 2 个包含对象的列表。我想比较它们并返回新列表中的所有新对象

我尝试下面的代码,但我没有得到回答

 var inInsyt = (from prd in db.COM_CUSTOMER_PRODUCT
                 join inv in db.INS_INVENTORY on prd.COM_CUSTOMER_PRODUCT_ID 
                 equals inv.COM_PRODUCT_ID
                 where prd.COM_CUSTOMER_ID == 5252
                 select new ProductInventoryInfo
                 {
                     sku = prd.PRODUCT_CODE,
                     quantity = inv.INV_AVAILABLE
                 }).ToList();


            var inEComSite = (from qlInv in db.INS_OPENCART_QOOLMART_INVENTORY
                              where qlInv.ID>0
                              select new ProductInventoryInfo
                              {
                                  sku = qlInv.SKU,
                                  quantity = qlInv.QUANTITY
                              }).ToList();

----------第一种方法------------------------------------ ------------------------------------------

            var firstNotSecond = inInsyt.Except(inEComSite).ToList();
            var secondNotFirst = inEComSite.Except(inInsyt).ToList();

--------------------第二种方法------------- ----------------------------------

 List<ProductInventoryInfo> objectList3 = inEComSite.Where(o => inInsyt.Contains(o)).ToList();

 List<ProductInventoryInfo> objectList4 = inInsyt.Where(o => !inEComSite.Contains(o)).ToList();

【问题讨论】:

  • 如果你想比较一些自定义数据类型的对象序列,你必须在帮助类中实现 IEquatable 通用接口。 DOCS
  • 请在下方查看我提交的答案

标签: c# list


【解决方案1】:

您应该为您的ProductInventoryInfo 类实现IEqualityComparer

看看here

【讨论】:

    【解决方案2】:

    如果你有两个字符串或数字的列表,可以使用以下方法进行比较

    主要方法

    var list1 = new List<string>
            {
                "Product 1",
                "Product 2",
                "Product 3",
                "Product 4"
            };
    
    var list2 = new List<string>
            {
                "Product 2",
            };
    
    var list3 = list1.Where(i => list2.All(x => x != i)).ToList();
    
    var list4 = list1.Except(list2).ToList();
    

    如果两个列表是objects可以使用以下方法进行比较

    ProductInventoryInfo

    public class ProductInventoryInfo
    {
        public string ProductName { get; set; }
    
        public override bool Equals(object obj)
        {
            if (!(obj is ProductInventoryInfo))
            {
                return false;
            }
    
            var other = (ProductInventoryInfo)obj;
            return this.ProductName == other.ProductName;
        }
    
        protected bool Equals(ProductInventoryInfo other)
        {
            return ProductName == other.ProductName;
        }
    
        public override int GetHashCode()
        {
            return (ProductName != null ? ProductName.GetHashCode() : 0);
        }
    }
    

    扩展方法比较对象

    public static class ExtensionsMethod
    {
        public static bool ObjectsAreEqual(this IEnumerable<ProductInventoryInfo> items, ProductInventoryInfo obj2)
        {
            return items.Any(productInventoryInfo => ObjectsAreEqual<ProductInventoryInfo>(productInventoryInfo, obj2));
        }
    
        private static bool ObjectsAreEqual<T>(T obj1, T obj2)
        {
            return JsonConvert.SerializeObject(obj1) == JsonConvert.SerializeObject(obj2);//convert object to json by Newtonsoft.Json and compare that
        }
    }
    

    主要方法

     var list1 = new List<ProductInventoryInfo>
            {
                new ProductInventoryInfo{ ProductName="Product 1"},
                new ProductInventoryInfo{ ProductName="Product 2"},
                new ProductInventoryInfo{ ProductName="Product 3"},
                new ProductInventoryInfo{ ProductName="Product 4"},
            };
    
     var list2 = new List<ProductInventoryInfo>
            {
                new ProductInventoryInfo{ ProductName="Product 2"},
            };
    
     var list3 = list1.Where(x => !list2.ObjectsAreEqual(x)).ToList(); //use Extensions Method
    
     //use override Equals
     var list4 = new List<ProductInventoryInfo>();
    
     list1.ForEach(x =>
         {
           list2.ForEach(y =>
              { 
                if (!x.Equals(y))
                  {
                     list4.Add(x);
                  }
              });
          });
    

    【讨论】:

      【解决方案3】:

      看下面的sn-p:

              List<int> firstList = new List<int>() { 1,2,2,3,3 };
              List<int> secondList = new List<int>() { 1 };
              List<int> newList = new List<int>();
      
              var firstNotSecond = firstList.Except(secondList).ToList();
              var secondNotFirst = secondList.Except(firstList).ToList();
      
              newList.AddRange(firstNotSecond);
              newList.AddRange(secondNotFirst);
      

      输出新列表:{2,3}

      【讨论】:

      • 感谢您的回复,对不起,我尝试了上述方法但我得到了错误的答案
      • 如果您将对象添加到相同类型的列表中,这将非常有效。(( var Difference = list2.Where(l2 => !list1.Any(l1 => l1.sku == l2.sku && l1.quantity == l2.quantity )); ))
      【解决方案4】:

      如果您将对象添加到相同类型的列表中,这将非常有效

      var differences = list2.Where(l2 => 
          !list1.Any(l1 => l1.sku == l2.sku && l1.quantity == l2.quantity ));
      

      或者(如果你愿意)

       var differences = list2.Where(l2 => 
              !list1.Any(l1 => l1.sku == l2.sku || l1.quantity == l2.quantity ));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多