2

我正在尝试删除字符“。” 来自除最后一次出现的字符串;例如字符串

12.34.56.78

应该变成

123456.78

我正在使用这个循环:

while (value != null && value.Count(c => c == '.') > 1)
 {
   value = value.Substring(0, value.IndexOf('.')) + value.Substring(value.IndexOf('.') + 1);
 }

我想知道是否有更简洁的方法(也许使用 linq?)在没有显式循环的情况下执行此操作?

(我知道有一个非常相似的问题,但是关于 perl 并且事情完全不同)

4

6 回答 6

5
int lastIndex = value.LastIndexOf('.');
if (lastIndex > 0)
{
    value = value.Substring(0, lastIndex).Replace(".", "")
        + value.Substring(lastIndex);
}
于 2012-12-12T16:21:42.770 回答
3

也许是string方法和 Linq 的混合:

string str = "12.34.56.78";
Char replaceChar = '.';
int lastIndex = str.LastIndexOf(replaceChar);
if (lastIndex != -1)
{
    IEnumerable<Char> chars = str
        .Where((c, i) => c != replaceChar || i == lastIndex);
    str = new string(chars.ToArray());
}

演示

于 2012-12-12T16:23:31.567 回答
1

我会这样做:

  1. 搜索最后一个“。” ;
  2. 子字符串 [0 .. indexOfLastDot] ;
  3. 删除任何“。” 子串的
  4. 将子字符串与原始字符串的其余部分连接起来,[indexOfLastDot ..剩余]

或者

  1. 搜索最后一个“。”
  2. 对于字符串的每个枚举字符
  3. 如果它是一个“。” 并且 i ≠ indexOfLastDot,删除它
于 2012-12-12T16:16:46.590 回答
1
  var splitResult = v.Split(new char[] { '.' }).ToList();
  var lastSplit = splitResult.Last();
  splitResult.RemoveAt(splitResult.Count - 1);
  var output = string.Join("", splitResult) + "." + lastSplit;

我会那样做。最简洁的方式并不总是最短的方式。

于 2012-12-12T16:19:45.853 回答
1

像这样的东西应该可以解决问题。“好”与否是另一回事。另请注意,没有错误检查。可能想要检查 null 或空字符串,并且该字符串中至少有一个"."

string numbers = "12.34.56.78";
var parts = String.Split(new char [] {'.'});
string newNumbers = String.Join("",parts.Take(parts.Length-1)
                                        .Concat(".")
                                        .Concat(parts.Last());

我并没有声称这对于长字符串会有很好的性能特征,但它确实使用了 Linq ;-)

于 2012-12-12T16:24:12.607 回答
0

您不必使用循环:

    //string val = "12345678";
    string val = "12.34.56.78";
    string ret = val;
    int index = val.LastIndexOf(".");
    if (index >= 0)
    {
        ret = val.Substring(0, index).Replace(".", "") + val.Substring(index);
    }
    Debug.WriteLine(ret);
于 2012-12-12T16:25:19.497 回答