C# 如何将全名字符串分为firstname和lastname字符串?

C# 如何将全名字符串分为firstname和lastname字符串?,c#,string,string-parsing,C#,String,String Parsing,我需要一些帮助,我有一个全名字符串,我需要做的是分开使用这个全名字符串作为firstname和lastname 如果您确定自己有名字和姓氏,这将起作用 string fullName = "Adrian Rules"; var names = fullName.Split(' '); string firstName = names[0]; string lastName = names[1]; public static string getLastNameCommaFirstName(St

我需要一些帮助,我有一个全名字符串,我需要做的是分开使用这个全名字符串作为firstname和lastname

如果您确定自己有名字和姓氏,这将起作用

string fullName = "Adrian Rules";
var names = fullName.Split(' ');
string firstName = names[0];
string lastName = names[1];
public static string getLastNameCommaFirstName(String fullName) {
    List<string> names = fullName.Split(' ').ToList();
    string firstName = names.First();
    names.RemoveAt(0);

    return String.Join(" ", names.ToArray()) + ", " + firstName;            
} 
确保检查
名称的长度

names.Length == 0 //will not happen, even for empty string
names.Length == 1 //only first name provided (or blank)
names.Length == 2 //first and last names provided
names.Length > 2 //first item is the first name. last item is the last name. Everything else are middle names
更新

当然,对于这个问题,这是一个相当简单的观点。我回答的目的是解释
string.Split()
是如何工作的。但是,您必须记住,有些姓氏是复合名,如@AlbertEin所指出的“路易斯·达席尔瓦”


这远远不是一个简单的问题。有些介词(法语、西班牙语、葡萄牙语等)是姓氏的一部分。这就是为什么@John Saunders问“什么语言?”。John还注意到前缀(Mr.,Mrs.)和后缀(Jr.,III,M.D.)可能会造成阻碍。

这是否像调用一样简单,传递一个空格作为拆分字符?还是这里有更棘手的事情?(如果是后者,请使用更多信息更新您的问题。)

尝试:

  string fullName = "The mask lol"; 
    string[] names = fullName.Split(' '); 
    string name = names.First();
    string lasName = names.Last(); 

您可以尝试使用空格对其进行解析,但它不起作用,例如:

var fullName = "Juan Perez";
var name = fullName.Substring(0, fullName.IndexOf(" "));
var lastName = fullName.Substring(fullName.IndexOf(" ") + 1);
但是如果有大量用户输入,那就失败了,如果他有两个名字呢?“胡安·帕布罗·佩雷斯”

名字是复杂的东西,所以,不可能总是知道给定字符串中的名字和姓氏是哪一部分

编辑


您不应该使用string.Split方法提取姓氏,有些姓氏是由两个或多个单词组成的,例如,我的一个朋友的姓氏是“Ponce de Leon”。

对于基本用例,只需在“”或“”上拆分即可,“然而,由于名字的多样性和不同的东西,这并不总是有效的。

我建议使用a来严格定义你的名字和姓氏。

以下是我在项目中使用的一段c代码。它返回最后一个单词作为姓氏,其余的作为名称

输出:

Mary Isobel Catherine O’Brien
-------------------------
Name : Mary Isobel Catherine , Surname : O’Brien
顺便说一下,没有中间名,对不起

public static string[] SplitFullNameIntoNameAndSurname(string pFullName)
{
    string[] NameSurname = new string[2];
    string[] NameSurnameTemp = pFullName.Split(' ');
    for (int i = 0; i < NameSurnameTemp.Length; i++)
    {
        if (i < NameSurnameTemp.Length - 1)
        {
            if (!string.IsNullOrEmpty(NameSurname[0]))
                NameSurname[0] += " " + NameSurnameTemp[i];
            else
                NameSurname[0] += NameSurnameTemp[i];
        }
        else
            NameSurname[1] = NameSurnameTemp[i];
    }
    return NameSurname;
}
public静态字符串[]将fullname拆分为name和name(字符串pFullName)
{
字符串[]nameurname=新字符串[2];
字符串[]nameurnametemp=pFullName.Split(“”);
对于(int i=0;i
您可以尝试移植这个PHP库

在nuget上有几个名称解析/拆分的实现。如果深入到NameParserSharp存储库中,您还可以将两个分部类组合起来,然后复制并粘贴到您自己的库中


此解决方案适用于姓氏不止一个单词的人。把第一个字当作第一个名字,其他的都当作姓氏

string fullName = "Adrian Rules";
var names = fullName.Split(' ');
string firstName = names[0];
string lastName = names[1];
public static string getLastNameCommaFirstName(String fullName) {
    List<string> names = fullName.Split(' ').ToList();
    string firstName = names.First();
    names.RemoveAt(0);

    return String.Join(" ", names.ToArray()) + ", " + firstName;            
} 

因此,如果您将第一个空格作为姓名,其余空格作为姓氏,这将给我们

Person myPerson = new Person();

Misc tidyup = new Misc();
string[] result = tidyup.SplitFullName(tb1.Text);

foreach (string s in result)
{
    Console.WriteLine(s);

    if (result.First() == s)
    {
        myPerson.FirstName = s;
    }
    else
    {
        myPerson.LastName += s + " ";
        Console.WriteLine(s);
        Console.WriteLine(myPerson.LastName);
    }
}    

public string[] SplitFullName(string myName)
{
    string[] names = myName.Split(' ');
    //string firstName = names[0];
    //string lastName = names[1];

    return names;
}
您可以使用
Split
方法,如下所示:

var testcase = "John Doe";
var split = testcase.Split(new char[] { ' ' }, 2);
在这种情况下,
split[0]
将是
John
split[1]
将是
Deo
。另一个例子:

var testcase = "John Wesley Doe";
var split = testcase.Split(new char[] { ' ' }, 2);
在这种情况下,
split[0]
将是
John
split[1]
将是
Wesley Doe

请注意,
split
的长度永远不会超过2

因此,使用以下代码,您可以很好地获得
FirstName
LastName

var firstName = "";
var lastName = "";
var split = testcase.Split(new char[] { ' ' }, 2);
if (split.Length == 1)
{
    firstName = "";
    lastName = split[0];
}
else
{
    firstName = split[0];
    lastName = split[1];
}

希望这个答案能为本页增加一些有用的东西

简单易用的代码,可以将花、爱等内容转换为爱之花(这适用于非常复杂的名称,如威廉姆斯·琼斯、鲁珀特·约翰):

输出:爱花

反过来说。爱的花朵变成了花朵,爱:

        string fullname = "Love Flowers";
        int indexOfTheSpace = fullname.IndexOf(' ');
        string firstname = fullname.Substring(0, indexOfTheSpace);
        string lastname = fullname.Substring(indexOfTheSpace + 1);
        WriteLine($"{lastname}, {firstname}");

对此,有多种方法。下面的代码示例解决了我的具体情况

例如


如果用户名中只有一个空格

如果用户名中有多个空格

name=“托尼·斯塔克死了”


您可以创建一个值对象来表示名称,并在应用程序中使用它

public class Name
{
    public string FirstName { get; private set; }
    public string LastName { get; private set; }
    public string FullName { get; }

    public Name(string name)
    {
        if (string.IsNullOrEmpty(name))
            return;

        FullName = name;

        LoadFirstAndLastName();
    }

    private void LoadFirstAndLastName()
    {
        var names = FullName.Trim().Split(" ", 2);

        FirstName = names.First();

        if (names.Count() > 1)
            LastName = names.Last();
    }

    public override string ToString() => FullName;

    //Enables implicit set (Name name = "Rafael Silva")
    public static implicit operator Name(string name) => new Name(name);
}
用途:

Name name = "Jhon Doe"; //FirstName = Jhon - LastName = Doe
Name name = new Name("Jhon Doe"); //FirstName = Jhon - LastName = Doe    
Name name = new Name("Rafael Cristiano da Silva"); //FirstName = Rafael - LastName = Cristiano da Silva

//On class property
public Name Name {get; set; } = "Jhon Doe";

迟到总比不迟到好,这是我在许多应用程序中使用的解决方案

 string fullName = "John De Silva";
 string[] names = fullName.Split(" ");
 string firstName = names.First(); // John
 string lastName = string.Join(" ", names.Skip(1).ToArray()); // De Silva

享受吧

用哪种语言?英语?你想用中间名做什么?你想用“Mr.”和“Jr.”或“Dr.Juan D.Garcia y Lopez Jr.,M.D.”做什么?你有分隔符吗
“Edimar*Lima”、*=分隔符
如果您不向我们显示实际字符串的外观,我们几乎无法为您提供帮助。正如John指出的,名称可能很棘手。根据您的使用情况,最好避免拆分名称,或者设计您的UI,以便您的用户自己进行拆分。我希望这样,不是吗?虽然不是…:(但我很高兴这不是“糟糕”:)代码中有一个错误。我修好了。Downvoter,请修改。“names.Length>2//索引0处是名字。索引长度-1处是姓氏。”:这不是真的!,可以不使用中间名,而使用由多个单词组成的姓氏。@阿德里安,例如“Pedro de la Garza”,名字:“Pedro”,姓氏:“de la Garza”。N如果名字是“Juan Carlos”,两者都是名字的一部分,可能应该更改代码以使用split方法,但是您提到了另一方不同意的内容。split的问题是,如果您的姓氏包含空格,您将丢失部分名字。例如,我的一个朋友姓“Ponce de leon”,这远远不是一个简单的问题。
public class Name
{
    public string FirstName { get; private set; }
    public string LastName { get; private set; }
    public string FullName { get; }

    public Name(string name)
    {
        if (string.IsNullOrEmpty(name))
            return;

        FullName = name;

        LoadFirstAndLastName();
    }

    private void LoadFirstAndLastName()
    {
        var names = FullName.Trim().Split(" ", 2);

        FirstName = names.First();

        if (names.Count() > 1)
            LastName = names.Last();
    }

    public override string ToString() => FullName;

    //Enables implicit set (Name name = "Rafael Silva")
    public static implicit operator Name(string name) => new Name(name);
}
Name name = "Jhon Doe"; //FirstName = Jhon - LastName = Doe
Name name = new Name("Jhon Doe"); //FirstName = Jhon - LastName = Doe    
Name name = new Name("Rafael Cristiano da Silva"); //FirstName = Rafael - LastName = Cristiano da Silva

//On class property
public Name Name {get; set; } = "Jhon Doe";
 string fullName = "John De Silva";
 string[] names = fullName.Split(" ");
 string firstName = names.First(); // John
 string lastName = string.Join(" ", names.Skip(1).ToArray()); // De Silva