在下面的代码中,我使用了3个foreach语句。我只是想在项目列表与另一项匹配时填充列表,但也必须添加不匹配的列表。所以我想知道是否有更简单的方法来执行以下操作。
List<T> ds = new List<T>(); //is populated
foreach (var b in template.Bs)
{
List<BD> tempList = new List<BD>();
foreach (BD bd in b.BDs)
{
Boolean found = false;
foreach (DV dv in items)
{
if (bd.C == dv.C)
{
found = true;
tempList.Add(new BD ()
{
//populating
});
}
}
if (!found)
tempList.Add(new BD()
{
//populating
});
}
}
答案 0 :(得分:6)
ds
和tempList
之间的关系并不清楚,但在我看来,你的内部循环实际上是一个左外连接:
List<T> ds = new List<T>(); //is populated
foreach (var b in template.Bs)
{
var newBDs = from bd in b.BDs
join dv in items on bd.C equals dv.C into j
from dv in j.DefaultIfEmpty()
select dv == null ? NoMatch(bd) : Match(bd, dv);
List<BD> tempList = newBDs.ToList();
// Do something with tempList
}
对于b
中的每个template.Bs
,我们将bd
中的b.BDs
与dv
中的items
进行匹配。然后,如果没有匹配,我们会使用DefaultIfEmpty()
将null
放入dv
,然后我们会使用它来确定要调用的投影方法:NoMatch()
会创建一个新的BD
1}}基于不匹配的bd
,Match()
会根据匹配的BD
和bd
创建新的dv
。
整个查询由newBDs
表示,其为IEnumerable<BD>
。然后我们可以将该序列缓冲到tempList
或者做一些对它有用的事情。