0

这是在c#中

我有 2 个用于名字和姓氏的文本框。我希望将一个名称字符串拆分为它所属的适当文本框,但问题是名称字符串可以是多种组合。它可以是“Mr John Smith”或“Mr Smith”,对于这些我得到的结果是好的,我现在遇到的问题是在拆分诸如“Mrs and Mrs 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;
  }
}
4

3 回答 3

1

您正在尝试将输入的所有实例作为{firstname} {lastname}. 现在的现实是你接受了大量不同形状和大小的输入。因此,您可以拼命试图强迫您的输入表现得像您想要的那样,或者您可以调整和更改解决方案以适应输入。

您将永远无法弄清楚名字、姓氏和头衔的所有可能组合。进来的人Duke Leopold von Haussknauf, Phd呢?

我知道这不是您要寻找的答案,但您应该考虑以某种方式更改解决方案。也许将其呈现在一个框中,或者让人们分别输入标题,名字和姓氏以开始?

于 2012-11-05T15:24:54.337 回答
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

于 2012-11-05T15:21:54.090 回答
0

我觉得你对前任的假设有些不恰当:史密斯先生将先生显示为名字,我建议使用其他方式输入您的数据,例如先生、夫人的下拉列表等,请多考虑您的要求

于 2012-11-05T16:00:36.107 回答