分隔第一个中间姓氏 C#

separate first middle last name C#

目标:在用户输入姓名时解析姓名,并在消息框中显示中间名和姓氏。现在它只在你输入三个名字时有效,如果你尝试两个它会崩溃,我确定这是我的数组的原因但我不确定我错在哪里。超级新手,自学,不胜感激!!

P.S。用户看到的 GUI 只是一个输入块,供他们在一行中输入他们的名字,每个单词之间有空格。

 private void btnParseName_Click(object sender, System.EventArgs e)
    {
        string fullName = txtFullName.Text;
        fullName = fullName.Trim();

        string[] names = fullName.Split(' ');

        string firstName = "";
        string firstLetter = "";
        string otherFirstLetters = "";
        if (names[0].Length > 0)
        {
            firstName = names[0];
            firstLetter = firstName.Substring(0, 1).ToUpper();
            otherFirstLetters = firstName.Substring(1).ToLower();
        }

        string secondName = "";
        string secondFirstLetter = "";
        string secondOtherLetters = "";
        if (names[1].Length > 0)
         {
            secondName = names[1];
            secondFirstLetter = secondName.Substring(0, 1).ToUpper();
            secondOtherLetters = secondName.Substring(0).ToLower();
         }

        string thirdName = "";
        string thirdFirstLetter = "";
        string thirdOtherLetters = "";
        if (names[2].Length > 0)
        {

            thirdName = names[2];
            thirdFirstLetter = thirdName.Substring(0, 1).ToUpper();
            thirdOtherLetters = thirdName.Substring(0).ToLower();

        }

        MessageBox.Show(
                "First Name:         " + firstLetter + otherFirstLetters + "\n\n" +
                "Middle Name:        " + secondFirstLetter + secondOtherLetters + "\n\n" +
                "Last Name:          " + thirdFirstLetter + thirdOtherLetters);

下面是工作示例:

public class FullName
{
    public  string FirstName { get; set; }
    public  string MiddleName { get; set; }
    public  string LastName { get; set; }

    public FullName()
    {

    }

    public FullName(string fullName)
    {
        var nameParts = fullName.Split(new [] {' '}, StringSplitOptions.RemoveEmptyEntries);

        if (nameParts == null)
        {
            return;
        }
        if (nameParts.Length > 0)
        {
            FirstName = nameParts[0];
        }
        if (nameParts.Length > 1)
        {
            MiddleName = nameParts[1];
        }
        if (nameParts.Length > 2)
        {
            LastName = nameParts[2];
        }
    }

    public override string ToString()
    {
        return $"{FirstName} {MiddleName} {LastName}".TrimEnd();
    }
}

用法示例:

class Program
{
    static void Main(string[] args)
    {
        var fullName = new FullName("first middle last");
        Console.WriteLine(fullName);
        Console.ReadLine();
    }
}

您需要检查并处理第二个名字是否为空。初始化字符串将防止崩溃,然后检查输入。

string secondName = "";    
string secondFirstLetter = ""; 
string secondOtherLetters = "";

if(names.Length > 2)
{
    secondName = names[1];
    secondFirstLetter = secondName.Substring(0, 1).ToUpper();
    secondOtherLetters = secondName.Substring(0).ToLower();
}

事实上,初始化所有变量或管理用户输入验证是值得的。

如另一个答案中所述,仅当存在第三个名字时才需要分配中间名。
下面的方法使用 Dictionary.TryGetValue 方法和 out 参数的 C#7 功能。

var textInfo = System.Globalization.CultureInfo.CurrentCulture.TextInfo;
var names = fullName.Split(' ')
                    .Where(name => string.IsNullOrWhiteSpace(name) == false)
                    .Select(textInfo.ToTitleCase)
                    .Select((Name, Index) => new { Name, Index })
                    .ToDictionary(item => item.Index, item => item.Name);

names.TryGetValue(0, out string firstName);
names.TryGetValue(1, out string middleName);
if (names.TryGetValue(2, out string lastName) == false)
{
    lastName = middleName;
    middleName = null;
}

// Display result
var result = new StringBuilder();
result.AppendLine("First name: ${firstName}");
result.AppendLine("Middle name: ${middleName}");
result.AppendLine("Last name: ${lastName}");

MessageBox.Show(result.ToString());

我知道您的问题已经得到解答,您可以通过多种方式来处理这个问题,但这里是我的建议以及一些解释:

private void button1_Click(object sender, EventArgs e)
{
    string fullName = "Jean Claude Van Dam";
    fullName = fullName.Trim();

    // So we split it down into tokens, using " " as the delimiter
    string[] names = fullName.Split(' ');

    string strFormattedMessage = "";

    // How many tokens?
    int iNumTokens = names.Length;

    // Iterate tokens
    for(int iToken = 0; iToken < iNumTokens; iToken++)
    {
        // We know the token will be at least one letter
        strFormattedMessage += Char.ToUpper(names[iToken][0]);

        // We can't assume there is more letters (they might have used an initial)
        if(names[iToken].Length > 1)
        {
            // Add them (make it lowercase)
            strFormattedMessage += names[iToken].Substring(1).ToLower();

            // Don't need to add "\n\n" for the last token
            if(iToken < iNumTokens-1)
                strFormattedMessage += "\n\n";
        }

        // Note, this does not take in to account names with hyphens or names like McDonald. They would need further examination.
    }

    if(strFormattedMessage != "")
    {
        MessageBox.Show(strFormattedMessage);
    }
}

这个例子避免了所有的变量。它利用了 operator [].

希望这对你也有帮助...:)

 public static string getMiddleName(string fullName)
    {
          var names = fullName.Split(' ');
        string firstName = names[0];
        string middleName = "";// names[1];
        var index = 0;
        foreach (var item in names)
        {
            if (index > 0 && names.Length -1 > index)
            {
                middleName += item + " ";
            }
            index++;
        }
        return middleName;
    }