迭代两个列表并使用lambda表达式检查第一个列表的项值到第二个列表的项值

时间:2016-03-03 11:56:02

标签: c# .net lambda

所以在我试图运行的程序中,我收到两个列表,一个包含字符串格式的id的对象(看起来像" bb_b1203322")和一个带有id&#的列表39; s(在这个地方仅命名为" b1203322"原因未知)以及对实际id的含义的描述。

var forms = await _tRepository.GetAllFormsAsync(lastUpdate);
var formDefinitions = await _deRepository.GetAllFormDefintionsAsync();

foreach (var form in forms)
{
    foreach (var def in formDefinitions)
    {
        if (form.SetupFormName.Contains(def.BLKID))
            form.SetupFormName = def.DESCR;
    }
}
return forms;

现在这段代码完全符合我的要求,但我宁愿将它作为lambda表达式,因为......原因:)

现在我已尝试了几种不同的东西,但凭借我目前对lambda表达式的了解,我无法让它发挥作用。

2 个答案:

答案 0 :(得分:0)

此代码使用一些LINQ来查找定义:

foreach(var form in forms)
{
    var def = formDefinitions.FirstOrDefault(x => form.SetupFormName.Contains(x.DESCR));
    if(def != null)
        form.SetupFormName = def.DESCR
}

正如您所看到的,它并没有真正保存所有代码。

请注意:
正如Jon正确评论的那样,此代码的行为与原始代码略有不同。如果有多个代码使用最后一次出现,则此代码使用第一次出现 如果这实际上是您的代码的用例,请将FirstOrDefault替换为LastOrDefault

扩展上面的代码,你可以这样做:

foreach(var tuple in forms.Select(x => new { Form = x,
                                             Definition = 
                                               formDefinitions.FirstOrDefault(y =>
                                                   x.SetupFormName.Contains(y.DESCR)) })
                          .Where(x => x.Definition != null))
{
    tuple.Form.SetupFormName = tuple.Definition.DESCR;
}

但正如你所看到的,这很快就会变得混乱。

答案 1 :(得分:0)

试试这段代码。请注意,如果formDefinitions始终存在合适的DESCR,则可以使用它。

forms.ForEach(f => f.SetupFormName = formDefinitions.FirstOrDefault(fd => 
    f.SetupFormName.Contains(fd.DESCR)).DESCR);