繁体   English   中英

替换列表中与开始字符串相同的字符串

[英]Replace the string in a list that are same with start 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\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/语言:-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}");
            }

但是有更好的方法吗? 或更快的方式

假设您将输入作为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列表不同,并打印该索引上的所有部分。 然后第一个索引返回到聚合器。 然后,聚合器将第一项与第二项进行比较,找到零件不同的第一个索引,并从那里打印零件等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM