除最后一个字符外,删除字符串中的其他字符

3
我正在尝试从字符串中移除字符“.”,除了最后一个出现的位置。例如,给定一个字符串:
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的,事情有些不同)

6个回答

5
int lastIndex = value.LastIndexOf('.');
if (lastIndex > 0)
{
    value = value.Substring(0, lastIndex).Replace(".", "")
        + value.Substring(lastIndex);
}

比我的更整洁,我因某种原因把它搞得过于复杂了... +1 - LukeHennerley
it's the same as @skp answer - Tobia Zambon

5
也许可以结合使用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());
}

Demo


C#没有auto吗?只是好奇。 - phaazon
1
不错!我总是喜欢使用Select/Where重载,将索引投影到序列中(如果适用)。 - wageoghe
我更喜欢skp解决方案,因为它不仅可用于字符替换,还可用于字符串替换。但是对于这个好的解决方案,我加一分,谢谢。 - Tobia Zambon

1
  var splitResult = v.Split(new char[] { '.' }).ToList();
  var lastSplit = splitResult.Last();
  splitResult.RemoveAt(splitResult.Count - 1);
  var output = string.Join("", splitResult) + "." + lastSplit;

我会用这种方式去做。最整洁的方式并不总是最短的方式。


1

类似这样的代码应该可以解决问题。它是否“好”是另一回事。请注意,此处没有错误检查。建议检查空值或空字符串,并确保字符串中至少有一个"."

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 ;-)


1
我会这样做:
  1. 查找最后一个 '.' ;
  2. 截取 [0 .. indexOfLastDot] 的子字符串;
  3. 就地删除子字符串中的任何 '.';
  4. 将子字符串与原始字符串的其余部分 [indexOfLastDot .. remaining] 连接起来。

或者

  1. 查找最后一个 '.';
  2. 对于字符串的每个枚举字符
  3. 如果它是 '.' 并且 i ≠ indexOfLastDot,则删除它。

2
最好提供代码示例(至少是伪代码),而不是解释你会做什么。 - Dave Zych
我明白,第一种解决方案更适合我。 - Tobia Zambon

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);

it's the same as @skp answer - Tobia Zambon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接