比较项目清单然后拆分

时间:2018-07-19 05:45:22

标签: c#

我创建了3个不同的列表变量,其中包含用于添加,删除和更新的数据。我必须将ExistingItemsNewItemList的数据进行比较,然后如果ExistingItems有数据但NewItemList没有数据,则该项目应列在deleteList变量中。像这样,如果NewItemList有数据但ExistingItems没有数据,则该项目应列在addList中。最后,当ExistingItems NewItemList匹配时,它将添加到updateList中。请注意,ID对于比较匹配是唯一的,并且ExistingItemsNewItemList两种数据模型类型都与Item类完全相同。我已经尝试使用Except()方法过滤addList,但这对我不起作用,因为我只想按ID而不是Price进行比较。

主要代码:

var addList = new List<Item>();
var updateList = new List<Item>();
var deleteList = new List<Item>();

addList = EixistingItems.Except(NewItemList).ToList();

物品类别:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestProj.Models
{
    Class Item 
    {
        public int ID { get; set; }
        public int Price { get; set; }
    }
}

2 个答案:

答案 0 :(得分:3)

我认为您需要的是一个相等比较器。它允许在Except linq语句中控制比较。然后,您可以定义仅检查ID属性:

var deleteList = ExistingItems.Except(NewItemList, new ItemComparer()).ToList();
var addList = NewItemList.Except(ExistingItems, new ItemComparer()).ToList();

class Item
{
    public int ID { get; set; }
    public int Price { get; set; }
}
class ItemComparer : IEqualityComparer<Item>
{
    public bool Equals(Item x, Item y)
    {
        return x.ID == y.ID;
    }

    public int GetHashCode(Item obj)
    {
        return obj.GetHashCode();
    }
}

答案 1 :(得分:1)

已更新

感谢弗雷加(Freggar)指出我的错误。 如果要在两个相同类型的对象之间进行比较,例如在OP问题中所述,则Except更可取。 plori已经提供了正确的答案,所以我不再赘述,应该选择他的答案。

例如,WhereAny一起使用的唯一情况是

Class Item_1
{
    public int ID { get; set; }
    public int Price { get; set; }
}

Class Item_2
{
    public int ID { get; set; }
    public int Price { get; set; }
    public int remark { get; set; }
}

由于Except使用hashset保存要比较的项目,在这种情况下无法再使用Except,依此类推,将Where与{{ 1}}。

原始答案

尝试

Any