子字符串长度不能小于零
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);
我按名字和姓氏分隔字符串。
我把最后一个词等同于姓氏。我将余数等同于名字。
此字符串可以为空或 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);