C#LINQ Group By并在该组上运行方法

问题描述 投票:0回答:1

我有一个查询,该查询正在查看将源文件与目标文件进行比较的方法的结果,并返回自定义对象,其中源文件中的属性在任何目标文件中都不同:

var conflictsAndSources = from conflict in FileConflicts
                                      from source in SourceFileObjects
                                      where conflict.Name == source.Name && conflict.PropertyA != source.PropertyA
                                      select new { Conflict = conflict, Source = source };

从此查询中,我得到一个集合conflictsAndSources,该集合将输入以下方法:

foreach (var conflictAndSource in conflictsAndSources)
                access.FixFileConflict(conflictAndSource.Conflict.FilePath, conflictAndSource.Conflict.Name, conflictAndSource.Source.PropertyA);

该方法有效,但是我的FixFileConflict方法出现问题。每次在foreach循环中运行此方法时,都必须打开,修改,保存和关闭文件。问题是同一文件可能存在数百个冲突,因此该文件将被打开和修改数百次。我显然想找到一种通过FilePath将这些冲突分组并将其全部传递给方法的方法。

我陷入了那部分。到目前为止,我有这个...

            var Groups = conflictsAndSources.GroupBy(x => (x.Conflict.FilePath));

            foreach(var group in Groups)
            {
                da.FixGroupOfFileConflicts(group.Key, the rest of the owl);
            }

我不需要FixGroupOfFileConflicts方法的帮助,但是如何将整个要处理的组传递给该方法。

对于每个文件,都有一层,并且每一层都有几个属性。在这种方法中,我希望打开我认为将为group.Key的文件,然后该组中的每个项目都具有.NamePropertyA设置。我需要将组中的每个成员传递到FixGroupOfFileConflicts中,以便我可以打开文件,然后遍历传递给它的组以查找每个图层,并将其PropertyA相应地设置为Source.PropertyA。

c# linq
1个回答
0
投票

这是最简单的方法:

    var Groups = conflictsAndSources.GroupBy(x => x.Conflict.FilePath, x => x.Source);

    foreach(var group in Groups)        
    {
         da.FixGroupOfFileConflicts(group.Key, group);
    }

然后,FixGroupOfFileConflicts方法签名为:

FixGroupOfFileConflicts(string conflictFilePath, IEnumerable<source type here> conflictsOfTheFile);
© www.soinside.com 2019 - 2024. All rights reserved.