如何将名称字符串拆分为两个文本框

时间:2012-11-05 15:15:15

标签: c# arrays textbox split substring

这是在c#

我有2个用于名字和姓氏的文本框。我希望将一个名称字符串拆分为它所属的相应文本框,但问题是名称字符串可以有多种组合。它既可以是“约翰史密斯先生”,也可以是“史密斯先生”,因为我得到的结果还可以,我现在遇到的问题是分裂像“夫人和夫人史密斯”之类的字符串。分裂不起作用我计划在第一个文本框中输入“Mr”,然后在第二个文本框中输入“和史密斯太太”。

下面是我的函数,任何人都可以提供帮助,因为我希望第一个名字的文本框带有第一个名称,如果有一个名字的文本框和名字的值,如果字符串是“史密斯先生和夫人”之类的话或“Mr& Mrs John Smith”

string name = "Mr and Mrs Smith";
string[] titles = new string[] {"Mr", "Miss", "Mrs", "Ms", "Master", "Mr and Mrs", 
           "Mr & Mrs", "Lady", "Lord", "Prof", "Proffessor", "Ma'am", "Madame"};
foreach (string title in titles)
{
  if (name.StartsWith(title) && !name.Equals(title, StringComparison.CurrentCultureIgnoreCase))
  {
    var titleLength = title.Length;
    var titlelessName = name.Substring(titleLength + 1);
    var spaceIndex = titlelessName.IndexOf(' ');
    if (spaceIndex > -1 && spaceIndex >= 0)
    {
      var firstName = titlelessName.Substring(0, spaceIndex);
      var lastName = titlelessName.Substring(spaceIndex + 1);
      txtFname.Text = firstName;
      txtLname.Text = lastName;
    }
  }
  else if (!name.StartsWith(title) && name.Contains(' '))
  {
    var firstName = name.Substring(0, name.IndexOf(' '));
    var lastName = name.Substring(name.IndexOf(' '));
    txtFname.Text = firstName;
    txtLname.Text = lastName;
  }
}

3 个答案:

答案 0 :(得分:1)

您正尝试将所有输入实例处理为{firstname} {lastname}形式的内容。现在的事实是,你接受了大量不同形状和大小的输入。因此,你可以抨击你的头部血腥试图迫使你的输入表现得像你想要的那样,或者你可以调整和改变解决方案以适应输入。

永远不会能够找出名字,姓氏和头衔的所有可能组合。那些输入Duke Leopold von Haussknauf, Phd的人呢?

我知道这不是您正在寻找的答案,但您应该考虑以某种方式更改解决方案。也许把它放在一个盒子里,或者让人们分别输入标题,名字和姓氏?

答案 1 :(得分:0)

你的问题是循环逻辑不正确。

首先检查标题是否匹配,如果不是,则拆分名称中的空格。这里的问题是,在您检查每个标题之前,不应该这样做。

更糟糕的是,如果你名字中的标题不是数组中的最后一个标题,那么通过数组的下一个循环将最终在循环中执行第二个条件并覆盖正确的行为。找到匹配的标题后,您需要退出循环!

所以,像这样(未经测试的代码):

    string name = "Mr and Mrs Smith";
    string[] titles = new string[] {"Mr", "Miss", "Mrs", "Ms", "Master", "Mr and Mrs", "Mr & Mrs", "Lady", "Lord", "Prof", "Proffessor", "Ma'am", "Madame"};
    var sortedTitles = from s in titles
         orderby s.Length descending
         select s;
    bool foundTitle = false;
    foreach (string title in sortedTitles)
    {
        if (name.StartsWith(title) && !name.Equals(title, StringComparison.CurrentCultureIgnoreCase))
        {
            var titleLength = title.Length;
            var titlelessName = name.Substring(titleLength + 1);
            var spaceIndex = titlelessName.IndexOf(' ');
            if (spaceIndex > -1 && spaceIndex >= 0)
            {
                var firstName = titlelessName.Substring(0, spaceIndex);
                var lastName = titlelessName.Substring(spaceIndex + 1);
                txtFname.Text = firstName;
                txtLname.Text = lastName;
            }
            foundTitle = true;
            break;
        }
    }
    if (!foundTitle && name.Contains(' '))
    {
        var firstName = name.Substring(0, name.IndexOf(' '));
        var lastName = name.Substring(name.IndexOf(' '));
        txtFname.Text = firstName;
        txtLname.Text = lastName;
    }

当然,这并没有考虑到你的标题清单远非详尽无遗,也不包括你可能会遇到的很多种类。那么Mr. and Mrs. Smith呢?

答案 2 :(得分:0)

我觉得你的假设不合适 例如:史密斯先生将先生称为先生的名字 我建议使用替代方式输入您的数据,例如下载先生,夫人......等 更多地考虑你的要求