子串的简单方法,不用担心超出字符串边界?

时间:2012-06-02 18:31:14

标签: c# .net

我现在正在使用这样的部分字符串:

something.Substring(0, something.Length >= 8 ? 8 : something.Length)

造成额外混乱的唯一原因是因为有时长度小于我在方法参数中放置的长度,这会导致错误。

是否有更简单的方法可以安全地裁剪文字

5 个答案:

答案 0 :(得分:14)

这里真的不需要一个丑陋的三元表达。

return something.Substring(0, Math.Min(length, something.Length));

答案 1 :(得分:7)

string上写一个隐藏“乱七八糟”的扩展方法。

public static string SafeSubstring(this string orig, int length)
{
  return orig.Substring(0, orig.Length >= length ? length : orig.Length);
}

something.SafeSubstring(8);

答案 2 :(得分:3)

Visual Basic实现Right()和Left()字符串函数。不管怎么说,他们都经过了很好的测试:

public static class Extensions {
    public static string Right(this string str, int Length) {
        if (Length < 0) throw new ArgumentOutOfRangeException("Length");
        if (Length == 0 || str == null) return string.Empty;
        int len = str.Length;
        if (Length >= len) return str;
        else return str.Substring(len - Length, Length);
    }
    public static string Left(this string str, int Length)
    {
        if (Length < 0) throw new ArgumentOutOfRangeException("Length");
        if (Length == 0 || str == null) return string.Empty;
        int len = str.Length;
        if (Length >= len) return str;
        else return str.Substring(0, Length);
    }
}

答案 3 :(得分:0)

这不是最有效的方法,我会选择Oded的解决方案,但这也是实现您所需要的方法:

new string(something.Take(8).ToArray());

答案 4 :(得分:0)

受到Hans Passant's answer的启发,这是一种更直接的方式来窃取&#34; Visual Basic实现。 (此方法需要添加对Microsoft.VisualBasic.dll的引用

public static class Extensions
{
    public static string Right(this string str, int Length) =>
        Microsoft.VisualBasic.Strings.Right(str, Length);

    public static string Left(this string str, int Length) =>
        Microsoft.VisualBasic.Strings.Left(str, Length);
}