当两个列表的类型不同时,如何将每个循环的嵌套转换为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变量"。
谢谢
您可以尝试使用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()
所述,需要调用强制枚举