C# 将字符串添加到列表<;字符串>;
我正在研究一个方法,它接受一个字符串并将其分成许多项,然后将其存储在数组中。然后,我执行检查,查看数组是否包含两个以上的项,如果包含,我会将数组中的特定项分配给相应的字符串,即将第一项分配给名字,将最后一项分配给姓氏,将所有其他项分配给中间名 我的问题是检索数组中不是第一个或最后一个项的每个项,然后按正确的顺序将它们分配给字符串。下面您可以看到,我试图获取名称数组中的每个项,并将结果分配给一个列表,然后该列表可以转换为单个字符串,但运气不佳。我正在寻找解决这个问题的办法C# 将字符串添加到列表<;字符串>;,c#,arrays,string,list,loops,C#,Arrays,String,List,Loops,我正在研究一个方法,它接受一个字符串并将其分成许多项,然后将其存储在数组中。然后,我执行检查,查看数组是否包含两个以上的项,如果包含,我会将数组中的特定项分配给相应的字符串,即将第一项分配给名字,将最后一项分配给姓氏,将所有其他项分配给中间名 我的问题是检索数组中不是第一个或最后一个项的每个项,然后按正确的顺序将它们分配给字符串。下面您可以看到,我试图获取名称数组中的每个项,并将结果分配给一个列表,然后该列表可以转换为单个字符串,但运气不佳。我正在寻找解决这个问题的办法 public s
public string SplitName(string text)
{
string forename;
string middlename;
string surname;
var name = text.Split(' ');
if (name != null)
{
if (name.Length > 2)
{
forename = name[0];
surname = name[name.Length - 1];
List<string> temp = new List<string>();
for (int i = 1; i < name.Length - 1; i++)
{
// Assign each item to middlename
}
text = string.Format("{0} {1} {2}", forename, middlename, surname);
}
}
else
{
text = "INVALID";
}
return text;
}
publicstringsplitname(字符串文本)
{
字符串名;
字符串名称;
串姓;
变量名称=text.Split(“”);
if(name!=null)
{
如果(name.Length>2)
{
名字=名字[0];
姓氏=姓名[name.Length-1];
列表温度=新列表();
for(inti=1;i
这会将所有中间名添加到中间名中,中间名之间用空格分隔,并修剪最后一个空格
for (int i = 1; i < name.Length - 1; i++)
{
middlename+=name[i]+" ";
}
middlename = middlename.Trim(); // just for sure
for(int i=1;i
如果你还需要什么,请说明你的问题
如果你的名字是
aa bb cc dd ee
midlename将是
bb cc dd
使用String.Join()
如果希望使用不同的字符串连接,请更改join(“”)的第一个参数。目前,一个名字“鲍勃·杰克·威利斯·米尔斯”将创造一个中间名“杰克·威利斯”。如果你想要“Jack,Willis”用“,”作为分隔符。试试这个:
public string SplitName(string text)
{
string forename;
string middlename;
string surname;
var name = text.Split(' ');
if (name != null)
{
if (name.Length > 2)
{
forename = name[0];
surname = name[name.Length - 1];
middlename = string.Join(" ", name.Skip(1).Take(name.Length - 2));
text = string.Format("{0} {1} {2}", forename, middlename, surname);
}
}
else
{
text = "INVALID";
}
return text;
}
但是这个返回的字符串完全相同。首先,您需要初始化字符串变量,然后您可以将所有“中间”项附加到它
public string SplitName(string text)
{
string forename = string.Empty;
string middlename = string.Empty;
string surname = string.Empty;
var name = text.Split(' ');
if (name != null)
{
if (name.Length > 2)
{
forename = name[0];
surname = name[name.Length - 1];
List<string> temp = new List<string>();
for (int i = 1; i < name.Length - 1; i++)
{
middlename += name[i];
}
text = string.Format("{0} {1} {2}", forename, middlename, surname);
}
}
else
{
text = "INVALID";
}
return text;
}
publicstringsplitname(字符串文本)
{
string forename=string.Empty;
string middlename=string.Empty;
string姓氏=string.Empty;
变量名称=text.Split(“”);
if(name!=null)
{
如果(name.Length>2)
{
名字=名字[0];
姓氏=姓名[name.Length-1];
列表温度=新列表();
for(inti=1;i
如果您只想分别保留第一个和最后一个标记,并将其他所有标记作为中间名,那么使用正则表达式会简单得多:
var regex = new Regex(@"^(\S+)\s+(?:(.*?)(?:\s+)?)(\S+)$");
var match = regex.Match("foo bar baz");
if (match.Success) {
var firstName = match.Groups[1].Value;
var middleName = match.Groups[2].Value;
var lastName = match.Groups[3].Value;
}
else {
// there were no spaces, i.e. just one token
}
正则表达式在结尾处用
\S+
匹配两行非空格字符。它可以选择使用模式(?:(.*?)(::(.*?)(:::::::?)
,其中重要的部分是(.*?)
(匹配任何内容,不贪婪,以避免在姓氏之前占用任何空格),其余大部分内容都是繁文缛节(不捕获组,在姓氏之前可选空格).您有输入示例吗?发生了什么事?错误?我认为text.Split()
永远不会返回null。如果text
为空,它将抛出一个异常,如果为空,它将返回一个包含单个空项的数组。@Magnus,我完全忽略了这一点,多亏了提醒。@Sayse我收到了关于这个问题的多个方法的错误,因为我不知道如何实际解决这个问题,这就是为什么我要求解决这个问题。
var regex = new Regex(@"^(\S+)\s+(?:(.*?)(?:\s+)?)(\S+)$");
var match = regex.Match("foo bar baz");
if (match.Success) {
var firstName = match.Groups[1].Value;
var middleName = match.Groups[2].Value;
var lastName = match.Groups[3].Value;
}
else {
// there were no spaces, i.e. just one token
}