我有这堂课:
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;
}
}
答案 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);