C# 比较两个列表并按特定条件添加缺少的项

C# 比较两个列表并按特定条件添加缺少的项,c#,list,c#-4.0,parallel-processing,compare,C#,List,C# 4.0,Parallel Processing,Compare,我编写了如下代码: foreach (var itemA in itm) { foreach (var itemB in filteredList) { if (itemA.ItemID != itemB.ItemID) { missingList.Add(itemB); ListToUpdate.Add(itemB); } else {

我编写了如下代码:

foreach (var itemA in itm)
{
    foreach (var itemB in filteredList)
    {
        if (itemA.ItemID != itemB.ItemID)
        {
            missingList.Add(itemB);
            ListToUpdate.Add(itemB);
        }
        else
        {
            if (itemA.QuantitySold != itemB.QuantitySold)
            {
                ListToUpdate.Add(itemB);
            }
        }
    }
}
如你所见,我这里有两个列表,它们的结构相同,它们是:

List #1 is "itm" list - which contains old records from DB

List #2 is "filteredList" - which has all items from DB and + new ones
我正在尝试将项目添加到missingList和ListToUpdate中,以更新下一个条件:

All items that are "new" in filteredList - meaning their ItemID doens't exists in  "itm" list should be added to missingList.

And all items that are new in filteredList- filteredList - meaning their ItemID doens't exists in  "itm" list should be added to .ListToUpdate

And final criteria to add items to ListToUpdate should be those items that exist in both lists - and if the quantitysold in "itm" list is different - add them to ListToUpdate
上面我写的代码给了我完全错误的结果,我最终在两个列表中都有超过50000个额外的项目

我想以一种类似于我上面所写的方式来修改代码,并可能使用并行循环或PLINQ来加快速度


有人能帮我吗?

下面是一个比较两个列表的示例,这两个列表将为您提供新ID列表

I类用于保存数据

 public class ItemList
{
    public int ID { get; set; }
}
函数获取新ID

private static void GetNewIdList()
    {
        List<ItemList> lstItm = new List<ItemList>();
        List<ItemList> lstFiltered = new List<ItemList>();

        ItemList oItemList = new ItemList();
        oItemList.ID = 1;
        lstItm.Add(oItemList);
        lstFiltered.Add(oItemList);

        oItemList = new ItemList();
        oItemList.ID = 2;
        lstItm.Add(oItemList);
        lstFiltered.Add(oItemList);

        oItemList = new ItemList();
        oItemList.ID = 3;
        lstFiltered.Add(oItemList);

        var lstListToUpdate = lstFiltered.Except(lstItm);


        Console.WriteLine(lstListToUpdate);
    }
更新2 用于从基于ID的筛选列表中获取新ID的列表

 var lstListToUpdate2 = lstFiltered.Where(a => !lstItm.Select(b => b.ID).Contains(a.ID));

下面是一个比较两个列表的示例,这两个列表将为您提供新ID的列表

I类用于保存数据

 public class ItemList
{
    public int ID { get; set; }
}
函数获取新ID

private static void GetNewIdList()
    {
        List<ItemList> lstItm = new List<ItemList>();
        List<ItemList> lstFiltered = new List<ItemList>();

        ItemList oItemList = new ItemList();
        oItemList.ID = 1;
        lstItm.Add(oItemList);
        lstFiltered.Add(oItemList);

        oItemList = new ItemList();
        oItemList.ID = 2;
        lstItm.Add(oItemList);
        lstFiltered.Add(oItemList);

        oItemList = new ItemList();
        oItemList.ID = 3;
        lstFiltered.Add(oItemList);

        var lstListToUpdate = lstFiltered.Except(lstItm);


        Console.WriteLine(lstListToUpdate);
    }
更新2 用于从基于ID的筛选列表中获取新ID的列表

 var lstListToUpdate2 = lstFiltered.Where(a => !lstItm.Select(b => b.ID).Contains(a.ID));
让我们使用C#4.0中提供的:

上面的代码使用了两个嵌套的并行列表迭代器。

让我们使用C#4.0中提供的:


上面的代码使用两个嵌套的并行列表迭代器。

简而言之,您有两个列表,为仅存在于筛选列表中的ID创建一个新列表,并为存在于两个列表中的ID创建另一个列表(ListToUpdate)。是吗?你应该为每个标准写一个方法来接收问题的3个子集,然后合并结果。奖励:这三种方法可以并行运行。@a是的,这是正确的,对第二个列表稍作更改-为两个列表(ListToUpdate)中都存在的ID创建另一个列表,但仅限于那些具有不同QuantitySeld属性的ID,这意味着新列表中的ItemID比旧列表中的ItemID(db)有更多的销售量@Dawnkeeper你能给我举个例子吗?简而言之,你有两个列表,为只存在于过滤列表中的ID创建一个新列表,并为存在于两个列表中的ID创建另一个列表(ListToUpdate)。是吗?你应该为每个标准写一个方法来接收问题的3个子集,然后合并结果。奖励:这三种方法可以并行运行。@a是的,这是正确的,对第二个列表稍作更改-为两个列表(ListToUpdate)中都存在的ID创建另一个列表,但仅限于那些具有不同QuantitySeld属性的ID,这意味着新列表中的ItemID比旧列表中的ItemID(db)有更多的销售量@Dawnkeeper你能给我举个例子说明如何做到这一点吗?Except方法根据什么标准比较这两个列表?由于我的类类型是从EF生成的,我可能应该重写except方法,以便比较特定属性上的两个列表?我已在上面的代码中粘贴了用于指定属性的更新。except方法根据哪些条件比较这两个列表?因为我的类类型是从EF生成的,所以我可能应该重写Exception方法,以便比较特定属性上的两个列表?我已经在上面的代码中粘贴了用于指定属性的更新。