我想将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变量"。
由于
答案 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()
所述,需要强制进行枚举。