C#比较2列表对象并创建第三个

时间:2017-04-26 16:16:39

标签: c# linq

我有这堂课:

public class Bills
{
    public int Denom;
    public int NumberItems;
}

这个类的两个列表:

ListA:
 Denom:20
 NumberItems:1

ListB:
 Denom:20
 NumberItems:4,
 Denom:50
 NumberItems:2

如何制作第三个列表的LINQ,而不同于这两个列表:

ListC:
 Denom:20
 NumberItems:3
 Denom:50
 NumberItems:2

我知道这可以用foreach制作,但我认为有更好的方法。

ListA中的Elemts将始终在ListB中具有相同或更小的NumberItems,但ListB中的elemts可能不在ListA中;没有Denom在每个List中重复

这是适用于我的foreach:

        List<Bills> ListC = new List<Bills>();

        foreach (var denomB in ListB) 
        {
            bool isInListA = false;

            foreach (var denomA in ListA) 
            {
                if (denomB.Value == denomA.Value)
                {
                    Bills diference = new Bills();
                    diference.Value = denomA.Value;
                    diference.NumberItems = denomB.NumberItems - denomA.NumberItems;

                    if(diference.NumberItems > 0) ListC.Add(diference);

                    isInListA = true;
                    break;
                }
            }

            if (!isInListA)
            {
                ListC.Add(denomB);
                break;
            }
        }

1 个答案:

答案 0 :(得分:1)

听起来你需要一个左外连接(见here)。像这样:

var listC = from b in listB join a in listA on b.Denom equals a.Denom into temp
    from t in temp.DefaultIfEmpty()
    select new Bills() { Denom = b.Denom, NumberItems = t != null ? b.NumberItems - t.NumberItems : b.NumberItems };

这是fiddle

我们的想法是将listB加入listA,其中Denom相等,然后选择一个具有相同Bills的新Denom项,并且NumberItems中的差异或(如果listB中不存在,只有NumberItems中的listB

现在,您的编辑中显示您要删除NumberItems == 0的项目,可以使用Where子句轻松完成:

listC = listC.Where(c => c.NumberItems > 0);