繁体   English   中英

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

[英]C# LINQ - Edit my query to call a method on the result

我见过与我类似的其他答案,但我很难将其应用于我的案例。

我创建了一个 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;
    }

现在我有了第三个冲突集合,我可以运行以下方法来纠正冲突:

    private void FixOnOffConflictsClick()
    {
        if (OnOffConflictLayers != null && OnOffConflictLayers.Count != 0)
        {
            DataAccess da = new DataAccess();

            foreach (LayerModel onOffConflict in OnOffConflictLayers)
            {
                foreach(LayerModel sourceLayer in SourceDrawingLayers)
                {
                    if(onOffConflict.Name == sourceLayer.Name)
                    {
                        string desiredSetting = sourceLayer.OnOff;
                        da.FixLayerConflict(onOffConflict.Path, onOffConflict.Name, desiredSetting);
                    }
                }
            }
        }
    }

我想将嵌套的 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM