C# C LINQ-编辑我的查询以对结果调用方法
我见过其他类似的答案,但我很难将其应用到我的案例中 我创建了一个LINQ查询,该查询将搜索两个集合,并从第二个集合中为我提供第三个集合,这些集合的特定属性与第一个集合中的相同属性不匹配:C# C LINQ-编辑我的查询以对结果调用方法,c#,linq,foreach,C#,Linq,Foreach,我见过其他类似的答案,但我很难将其应用到我的案例中 我创建了一个LINQ查询,该查询将搜索两个集合,并从第二个集合中为我提供第三个集合,这些集合的特定属性与第一个集合中的相同属性不匹配: private void GetOnOffConflicts() { DataAccess da = new DataAccess(); if (OnOffConflictLayers != null && OnOffConflictLayers.
private void GetOnOffConflicts()
{
DataAccess da = new DataAccess();
if (OnOffConflictLayers != null && OnOffConflictLayers.Count != 0)
{
OnOffConflictLayers.Clear();
}
var onOffQuery = from target in TargetDrawingLayers
from source in SourceDrawingLayers
where target.Name == source.Name && target.OnOff != source.OnOff
select target;
ObservableCollection<LayerModel> q = new ObservableCollection<LayerModel>(onOffQuery);
OnOffConflictLayers = q;
}
我想将嵌套的foreach循环转换为一个语句,该语句类似于我的第一个LINQ查询,但调用da.FixLayerConflict;作为查询的一部分
与嵌套的foreach相比,这是一个有意义的改进吗?我该怎么做呢
我试过这样的方法:
var fixOnOffQuery = from conflict in OnOffConflictLayers
from source in SourceDrawingLayers
where conflict.Name == source.Name && conflict.OnOff != source.OnOff
select new
{
da.FixLayerConflict(conflict.Path, conflict.Name, source.OnOff)
};
但是我对LINQ语法的了解还不够,无法创建有效的东西
顺便说一句,我无法将修复方法添加到原始查询中,因为这是程序要求用户在采取操作之前检查冲突的一部分。与其尝试在LINQ查询中进行方法调用,我建议您通过查询希望调用函数的项来删除嵌套的foreach,然后在单个foreach中使用该集合 类似这样的方法会奏效:
var conflictsAndSources = from conflict in OnOffConflictLayers
from source in SourceDrawingLayers
where conflict.Name == source.Name && conflict.OnOff != source.OnOff
select new { Conflict = conflict, Source = source };
foreach(var conflictAndSource in conflictsAndSources)
da.FixLayerConflict(conflictAndSource.Conflict.Path, conflictAndSource.Conflict.Name, conflictAndSource.Source.OnOff);
谢谢你,乔纳森。这似乎是一个非常简单和优雅的解决方案!但问题是,conflictAndSources超出了范围,无法在foreach中调用。有办法解决吗?@Kefka我在foreach中输入了一个错误,其中conflictsAndSources就是conflictsAndSources。这就是问题所在吗?啊,是的。谢谢我会试一试,但它看起来会起作用。如果有,我会回来标记你的答案!再次感谢@RickPangburn您可以去掉额外的循环,只需在select:from…中调用。。。。选择da.FixLayerConflictconflict.Path,conflict.Name,cource.OnOff@假设FixLayerConflict不是void方法的jcruz。
var conflictsAndSources = from conflict in OnOffConflictLayers
from source in SourceDrawingLayers
where conflict.Name == source.Name && conflict.OnOff != source.OnOff
select new { Conflict = conflict, Source = source };
foreach(var conflictAndSource in conflictsAndSources)
da.FixLayerConflict(conflictAndSource.Conflict.Path, conflictAndSource.Conflict.Name, conflictAndSource.Source.OnOff);