C#搜索列表

时间:2009-07-25 00:59:12

标签: c# .net

在下面的代码中,我使用了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
                    });
            }

        }

1 个答案:

答案 0 :(得分:6)

dstempList之间的关系并不清楚,但在我看来,你的内部循环实际上是一个左外连接:

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.BDsdv中的items进行匹配。然后,如果没有匹配,我们会使用DefaultIfEmpty()null放入dv,然后我们会使用它来确定要调用的投影方法:NoMatch()会创建一个新的BD 1}}基于不匹配的bdMatch()会根据匹配的BDbd创建新的dv

整个查询由newBDs表示,其为IEnumerable<BD>。然后我们可以将该序列缓冲到tempList或者做一些对它有用的事情。