当两个列表的类型不同时,如何将每个循环的嵌套转换为Linq

本文关键字:嵌套 Linq 转换 循环 两个 列表 类型 | 更新日期: 2023-09-27 18:15:48

我想将c#中的嵌套foreach循环转换为Linq。如果两个列表是同一类型,我知道该怎么做。但在我的例子中,它们是不同的类型,除了它们都有两个共同的属性,DocumentId和IsValid。我必须遍历外部列表和内部列表,每当两者的documententid相同时,然后将外部循环对象的IsValid值分配给内部循环对象。我有以下foreach循环工作正常。

foreach (var docs in outerDocuments)
{
     foreach (var presentedDocuments in innerdocuments)
     {
           if (docs.DocumentId.Equals(presentedDocuments.DocumentId))
           {
                 presentedDocuments.IsValid = docs.IsValid;
           }
     }
}

我需要将其转换为Linq。通常ReSharper在重构这类代码方面做得很好。但是在这种情况下,它只将嵌套的foreach转换为Linq,即使这样它也抛出了一个警告,"在闭包中访问foreach变量"。

谢谢

当两个列表的类型不同时,如何将每个循环的嵌套转换为Linq

您可以尝试使用Enumerable.Join:

foreach (var item in outerDocuments.Join(innerdocuments,
                                         outer => outer.DocumentId,
                                         inner => inner.DocumentId,
                                         (outer, inner) => new { OuterDoc = outer, InnerDoc = inner }))
{
    item.InnerDoc.IsValid = item.OuterDoc.IsValid;
}

试试这个:

foreach (var presentedDocuments in innerdocuments)
{
    var doc = outerDocuments.FirstOrDefault(a => a.DocumentId.Equals(presentedDocuments.DocumentId));
    if (doc != null)
    {
        presentedDocuments.IsValid = doc.IsValid;
    }
}

您可以使用.Join()扩展方法,并在一行中这样做:

outerDocuments.Join(innerDocuments, o => o.DocumentId, i => i.DocumentId, (o, i) =>  i.IsValid = o.IsValid).ToList();

如@sstan .ToList()所述,需要调用强制枚举