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)
我想要做的是合并具有相同(Source和Target)和相同的行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层次结构.但我仍然没有找到正确的语法,所以这就是为什么我没有粘贴任何代码.
提前致谢!
您只需要一个使用索引访问列表项的循环,从当前项开始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像你写的那样。