【问题标题】:C# LINQ - Edit my query to call a method on the resultC# LINQ - 编辑我的查询以在结果上调用方法
【发布时间】:2019-12-02 16:35:43
【问题描述】:

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

我创建了一个 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 语法的了解还不够,无法创建有效的东西。

顺便说一句,我无法将修复方法添加到原始查询中,因为程序要求用户在采取行动之前检查冲突。

【问题讨论】:

    标签: c# linq foreach


    【解决方案1】:

    我建议您不要尝试在 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 中有错字,conflictsAndSourcesconflictAndSources。是这个问题吗?
    • 啊,是的。谢谢。我会试一试,但看起来它会起作用。如果是这样,我会回来标记你的答案!再次感谢!
    • @RickPangburn 您可以摆脱额外的循环,只需在您的选择中调用:from .... select da.FixLayerConflict(conflict.Path, conflict.Name, cource.OnOff);
    • @jcruz 假设 FixLayerConflict 不是 void 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多