【问题标题】:C# split string on a separator then remove an element and then join again by using a separatorC# 在分隔符上拆分字符串,然后删除一个元素,然后使用分隔符再次连接
【发布时间】:2021-01-04 22:47:41
【问题描述】:

我有一个类似"SS\u001ffsdf\u001fA123456\u001f" 的字符串。

我正在使用下面的代码来拆分字符串,

var record = _recordSection.Split("\u001f");

我得到一个类似"SS""ffsdf""A123456" 的字符串数组。

我想删除"A123456",然后再次格式化字符串

"SS\u001ffsdf\u001f\u001f"我该怎么办?

【问题讨论】:

  • 你怎么知道这是你要删除的元素?是因为它是第三个元素,它的值是"A123456",还是其他一些标准?如果你能回答这个问题,你也许可以自己弄清楚。
  • “在分隔符上拆分字符串然后删除一个元素,然后使用分隔符再次加入”似乎正是您想要做的......哪部分有问题?绝对不是bing.com/search?q=c%23+remove+element+array...我怀疑组合回来是否也是个问题-stackoverflow.com/questions/19624855/…
  • _recordSection = _recordSection.Replace("A123456", ""); 工作吗?
  • @madreflection 对不起,它永远是第三个元素。
  • 查找string.Join - 这有点与string.Split相反。不过,您并没有真正删除 "A123456",而是将其替换string.Empty(或"")。我认为@madreflection 的观点是最难的部分。你怎么知道要删除哪个位?

标签: c# string split


【解决方案1】:

如果要删除元素A123456.Select() 和三元运算符就足够了。

string _recordSection = "SS\u001ffsdf\u001fA123456\u001f";
var record = _recordSection.Split('\u001f');
var merged = string.Join("\u001f", record.Select(x => x != "A123456" ? x : string.Empty));

如果你想删除 third 元素,那就更简单了:

string _recordSection = "SS\u001ffsdf\u001fA123456\u001f";
var record = _recordSection.Split('\u001f');
record[2] = string.Empty;
var merged = string.Join("\u001f", record);

【讨论】:

    【解决方案2】:

    如果你说,你需要删除第三个元素 - 你可以使用 xanato 的解决方案或这个:

    int positionToRemove = 3;
    string separator = "\u001f";
    string _recordSection = "SS\u001ffsdf\u001fA123456\u001f";
    
    var recordList = _recordSection.Split(separator).ToList();
    recordList.Remove(recordList[positionToRemove - 1]);
    var result = string.Join(separator, recordList);
    
    Console.WriteLine(result); //will output "SS\u001ffsdf\u001f\u001f"
    

    【讨论】:

      【解决方案3】:

      所有不错的解决方案,但使用 string.Split 在大字符串上可能效率低下。

      如果你需要删除最后一个元素,你可以这样计算子字符串的大小:

      var record = _recordSection.Substring(
          0,
          _recordSection.LastIndexOf('\u001f', _recordSection.Length - 2)) + "\u001f\u001f";
      

      从一开始就可以通过连续的IndexOf 调用来完成相同的操作。

      似乎没有人指出\u001f 是单个转义的char

      【讨论】:

        【解决方案4】:

        试试这个:

        private const string InitialString = "SS\u001ffsdf\u001fA123456\u001f";
        private const char Separator = '\u001f';
        

        然后只是拆分,替换第三项并重新加入:

        var splitStrings = InitialString.Split(Separator);
        splitStrings[2] = string.Empty;
        var result = string.Join(Separator.ToString(), splitStrings);
        

        完成后,result 看起来像(从调试器复制):

        "SS\u001ffsdf\u001f\u001f"
        

        如果您想要“最后一项”而不是第三项,请使用splitStrings.Length-1 作为索引而不是2

        【讨论】:

          【解决方案5】:

          不需要比以下更复杂:

          using System;
          using System.Linq;
          
          namespace HandyExtensions
          {
              static class StringExtensions
              {
                  static string Splice(this string s, string separator, Func<string, int, bool> desired ) {
                      string[] segments = s.Split(separator)
                                           .Where( desired )
                                           .ToArray()
                                           ;
                      return String.Join(separator, segments);
                  }
              }
          }
          

          这应该让你说类似的话

          "a,b,c,d,e,f,g".Splice(",", (s,i) => i % 2 == 0 )
          

          然后返回"a,c,e,g"

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-10-01
            • 1970-01-01
            • 2017-04-23
            • 2015-01-12
            • 2017-04-01
            • 1970-01-01
            • 2013-02-07
            相关资源
            最近更新 更多