Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C LINQ-编辑我的查询以对结果调用方法_C#_Linq_Foreach - Fatal编程技术网

C# C LINQ-编辑我的查询以对结果调用方法

C# C LINQ-编辑我的查询以对结果调用方法,c#,linq,foreach,C#,Linq,Foreach,我见过其他类似的答案,但我很难将其应用到我的案例中 我创建了一个LINQ查询,该查询将搜索两个集合,并从第二个集合中为我提供第三个集合,这些集合的特定属性与第一个集合中的相同属性不匹配: private void GetOnOffConflicts() { DataAccess da = new DataAccess(); if (OnOffConflictLayers != null && OnOffConflictLayers.

我见过其他类似的答案,但我很难将其应用到我的案例中

我创建了一个LINQ查询,该查询将搜索两个集合,并从第二个集合中为我提供第三个集合,这些集合的特定属性与第一个集合中的相同属性不匹配:

    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);