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

时间:2015-10-04 01:40:25

标签: c# linq

我想将C#中的嵌套foreach循环转换为Linq。如果这两个列表属于同一类型,我知道该怎么做。但在我的情况下,它们是不同类型的,除了它们都有两个共同的属性,DocumentId和IsValid。我必须遍历外部列表和内部列表,并且只要两者的DocumentId相同,然后将外部循环对象的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变量"。

由于

3 个答案:

答案 0 :(得分:1)

您可以尝试使用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;
}

答案 1 :(得分:0)

试试这个:

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

答案 2 :(得分:0)

您可以使用.Join()扩展方法,并在一行中执行此操作:

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

如@sstan .ToList()所述,需要强制进行枚举。