子字符串长度不能小于零

Substring Length cannot be less than zero

我按名字和姓氏分隔字符串。

我把最后一个词等同于姓氏。我将余数等同于名字。

此字符串可以为空或 null。 我正在检查 null return.

但如果字符串为空,则会出现以下错误。

或者我在只有名称时出错。 例如;字符串测试 = "杰克";

如何在不向代码中添加另一个“if else”控件的情况下在一行中完成此操作?

https://dotnetfiddle.net/7lr07G

[System.ArgumentOutOfRangeException: Length cannot be less than zero.
Parameter name: length]
   at System.String.Substring(Int32 startIndex, Int32 length)

问题是 test.LastIndexOf(" ") 如果 test 中没有 space,则 returns -1。看看MSDN - String.Substring

您可以使用String.Contains

var firstname = !string.IsNullOrEmpty(test) && test.Contains(" ") 
        ? test.Substring(0, test.LastIndexOf(" ")) 
        : string.IsNullOrEmpty(test) ? string.Empty : test;
var lastname = !string.IsNullOrEmpty(test) && test.Contains(" ") 
        ? test.Split(' ').Last() 
        : string.Empty;

检查test中是否有space。

我建议使用 String.IsNullOrEmpty 而不是 test != null

试试这个:

    //string test = "Jack ";
    //string test = "Jack";
    string test = "Jack Nelsson";
    var firstname = string.Empty;
    var lastname =  string.Empty;

    if (!string.IsNullOrEmpty(test))
    {
        var index =  test.LastIndexOf(" ");
        if (index < 0 || index >= test.Length - 1)
        {
            firstname = test.TrimEnd();
        }
        else
        {
            firstname = test.Substring(0, index);
            lastname =  test.Substring(index + 1);
        }
    }
    Console.WriteLine(firstname);
    Console.WriteLine(lastname);

默认情况下,我们设置string.Empty。如果测试有一个字符串,我们搜索最后一个空格并存储在一个变量中以备后用。

如果找不到名称空间:将名字设置为所有文本。 如果在字符串末尾发现空格:将 firstname 设置为所有没有结尾空格的文本。我们需要检查这种情况,因为在这种情况下索引+1 的子字符串失败。 在其他情况下,在该点拆分字符串。

我更喜欢尽可能少地使用 IndexOf,因为我总是把自己与索引搞混。所以这是不同的方法:

string firstname = "";
string lastname = "";
if (!string.IsNullOrEmpty(name))
{
    var parts = name.Split(' ');
    lastname = parts[parts.Length-1];
    firstname = string.Join(" ", parts.Take(parts.Length-1));
}

它只是使用 space 拆分,然后将最后一部分作为姓氏并将其他部分作为名字加入。

编辑 我刚刚看到 Mighty Badaboom 的解决方案并受到使用 Last 的启发。这是一个包含更少整数的版本:

string firstname = "";
string lastname = "";
if (!string.IsNullOrEmpty(name))
{
    var parts = name.Split(' ');
    lastname = parts.Last();
    firstname = string.Join(" ", parts.SkipLast(1));
}

SkipLast 需要 .NET 标准 2.1。如果使用旧标准,您可以选择:

    firstname = string.Join(" ", parts.Reverse().Skip(1).Reverse());

试试这个:

string test = "Jack Daniels";
    
    var firstname = string.IsNullOrEmpty(test)
        ? string.Empty
        : (test.Contains(" ") ? (test.Substring(0, test.LastIndexOf(" "))).Trim() : test);
    var lastname = string.IsNullOrEmpty(test)
        ? string.Empty
        : (test.Contains(" ") ? (test.Substring(test.LastIndexOf(" ")).Trim()) : string.Empty);
    
    Console.WriteLine("firstname>>" + firstname);
    Console.WriteLine("lastname>>" + lastname);