4

当我想substring在 Java 中查找字符串中的文本区域时,我提供了两个索引,一个用于start,一个用于end,但是在 C# 中,我不得不提供 的长度substring作为参数,但是如果我不知道应该在哪里停下来,就会成为一个问题,导致我遇到这样的事情:

verse[i].Substring(verse[i].IndexOf("start"), (verse[i].IndexOf("end") - verse[i].IndexOf("start"));

而不仅仅是

verse[i].Substring(verse[i].IndexOf("start"), (verse[i].IndexOf("end"));

令人讨厌的是,我一遍又一遍地遇到这个问题,我想知道我是唯一一个还是有一个我不知道的技巧。你会如何最好地解决这个问题?(考虑清洁度和速度)

ps:我不喜欢为几乎所有东西创建变量。谢谢

4

4 回答 4

9

您可以像这样编写自己的扩展方法

var newstr = str.MySubString(start,end);

..

public static partial class MyExtensions
{
    public static string MySubString(this string s,int start,int end)
    {
        return s.Substring(start, end - start + 1);
    }
}
于 2012-11-25T20:39:07.010 回答
6

你接受的答案是错误的,因为你问错了。

在 java 中,当您调用 substring(START, END) 时,您会得到一个从 START 开始并以 END - 1 结束的子字符串。

在 c# 中,你只需要这样调用:

Substring(START, END - START);

如果您按照建议添加 1,您将获得不同的字符串。

于 2014-06-26T03:04:54.350 回答
2

OP问“C#中Java子字符串的等价物是什么”?我很高兴看到响应,因为我正在将使用 String.substring 的 Java 方法转换为 C#。但是,根据官方 Java 文档,子字符串从指定的 beginIndex 开始并延伸到索引 endIndex -1 处的字符 这对我来说不仅仅是一个微小的差异,因为我想以最少的努力将 Java 转换为 C#。上面提到的扩展是一个很好的答案,我当然可以接受。但对于我的需要,更精确的类似 Java 的版本应该是 return s.Substring(start, end - start); 不开始+1

使用 Java 文档示例,测试表明这是正确的:

[TestMethod]
    public void TestSubString()
    {
         Assert.AreEqual("urge", "hamburger".MySubstring( 4, 8));
        Assert.AreEqual("mile", "smiles".MySubstring(1, 5));
    }
于 2013-11-24T22:30:46.950 回答
0

试试这个扩展方法:

public static class StringExtensions
{
    public static string MySubstring(this string s, string start, string end)
    {
        int startI = s.IndexOf(start);
        int endI = s.IndexOf(end, startI);
        return s.Substring(startI, endI - startI + 1);
    }
}

像这样使用它:

string helloWorld = "startHello Worldend".MySubstring("start", "end");
string vers = verse[i].MySubstring("start", "end");

有时扩展方法可以挽救您的生命。您应该只知道,如果静态类是公共的并且在您的命名空间中,那么使用您的命名空间的每个人也会获得您的扩展。

于 2012-11-25T21:04:26.897 回答