我不知道我的标题是否正确。
我有一个清单
\1925\10\04\issue1
\1925\10\05\issue1
\1925\10\07\issue1
\1925\10\10\issue1
\1925\10\11\issue1
\1925\10\12\issue1
\1925\10\13\issue1
\1925\10\14\issue1
\1925\10\15\issue1
\1925\10\17\issue1
\1925\10\18\issue1
\1925\10\19\issue1
然后我想要在列表中做的事情就变成了
\1925\10\04\issue1
\05\issue1
\07\issue1
\10\issue1
\11\issue1
\12\issue1
\13\issue1
\14\issue1
\15\issue1
\17\issue1
\18\issue1
\19\issue1
我需要它是动态的。
在某些情况下,我可能会有这样的列表
\1925\10\04\issue1
\1925\10\04\issue2
\1925\10\04\issue3
\1925\10\04\issue4
输出是这样的
\1925\10\04\issue1
\issue2
\issue3
\issue4
到目前为止,我正在使用差异匹配补丁。
https://github.com/google/diff-match-patch/wiki/Language:-C%23
这是我的代码。
diff_match_patch dmp = new diff_match_patch();
var d = dmp.diff_main(@"\1925\10\14\issue1", @"\1925\10\05\issue1");
//dmp.diff_cleanupEfficiency(d);
foreach (var item in d)
{
Console.WriteLine($"text {item.text} operation {item.operation}");
}
但是有更好的方法吗?或更快的方式
答案 0 :(得分:2)
假设您输入的内容为List<string> input
,则此代码应该有效:
var splittet = input.Select(i => i.Split("\\".ToCharArray(), StringSplitOptions.RemoveEmptyEntries));
Action<string[], int> print = (string[] lst, int index) => Console.WriteLine("\\" + string.Join("\\", lst.Skip(index)));
splittet.Aggregate(new string[] { },
(common, item) =>
{
var index = Enumerable.Range(0, Math.Min(common.Length, item.Length)).FirstOrDefault(i => common[i] != item[i]);
print(item, index);
return item;
}
);
因此请输入
var input = new List<string> { @"\1925\10\04\issue1",
@"\1925\10\05\issue1",
@"\1925\10\07\issue1",
@"\1925\10\10\issue1",
@"\1925\10\11\issue1",
@"\1925\10\12\issue1",
@"\1925\10\04\issue1",
@"\1925\10\04\issue2",
@"\1925\10\04\issue3",
@"\1925\10\04\issue4"};
这是输出:
\1925\10\04\issue1
\05\issue1
\07\issue1
\10\issue1
\11\issue1
\12\issue1
\04\issue1
\issue2
\issue3
\issue4
一些解释:
首先,我不使用字符串列表,而是将其拆分为令牌列表。
然后我定义了一些打印操作。您可以将结果添加到输出列表或执行任何操作。在这种情况下,它只是写到控制台
然后将列表汇总。 aggreagtor以一个空的字符串数组开头。然后它会尝试找到第一个索引,其中第一个项目与emtpy列表不同,并打印该索引上的所有部分。然后第一个索引返回到聚合器。然后,聚合器将第一个项目与第二个项目进行比较,找到零件不同的第一个索引,然后从那里打印零件,等等。