C# - 根据一些匹配值将列表项合并为一个项

ala*_*egh 5 c# linq merge list

我有一个项目列表(List<Tasks> tasks),像这样:

Id                     Action               Source       Target
-------               ---------            --------     ---------
1                      Save                 12           18
4                      Save                 18           21
7                      Save                 21           23
6                      Save                 23           25
10                     Save                 25           27
16                     Save                 29           31
0                      Edit                 31           37
Run Code Online (Sandbox Code Playgroud)

我想要做的是合并具有相同(SourceTarget)和相同的行Action.例如,我最终需要的应该是这样的:

Id                     Action               Source       Target
-------               ---------            --------     ---------
22                     Save                 12           27
16                     Save                 29           31
0                      Edit                 31           37
Run Code Online (Sandbox Code Playgroud)

这意味着,所有具有相同的项目Action(在我的情况下,这里保存)应该合并到一个行/项目,但仅Target上项目的Source值等于跟随项目的值的情况下.跟随者是较低的项目.

例如,upper是item Id = 1,lower/follower是item Id = 4.所以记录如下.

有没有办法用linq避免太多的foreach循环?也许类似于SQL中的CTE层次结构.但我仍然没有找到正确的语法,所以这就是为什么我没有粘贴任何代码.

提前致谢!

Sin*_*atr 0

您只需要一个使用索引访问列表项的循环,从当前项开始1并将当前项与前一项相结合,如果它们的Action匹配项和Target前一项的匹配等于Source当前项:

for (int i = 1; i < items.Count; i++)
    if (items[i].Action == items[i - 1].Action && items[i].Source == items[i - 1].Target)
    {
        items[i - 1].Target = items[i].Target;
        items.RemoveAt(i);
        i--; // to have same index after i++
    }
Run Code Online (Sandbox Code Playgroud)

这不会改变Id,所以它会是这样1,而不是22像你写的那样。