Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将名称字符串拆分为两个文本框_C#_Arrays_Textbox_Split_Substring - Fatal编程技术网

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

C# 如何将名称字符串拆分为两个文本框,c#,arrays,textbox,split,substring,C#,Arrays,Textbox,Split,Substring,这是c# 我有两个文本框,分别是firstname和lastname。我希望将一个名称字符串拆分为它所属的相应文本框,但问题是名称字符串可能有多种组合。它可以是“Mr John Smith”或“Mr Smith”,因为我得到的结果是ok的,我现在遇到的问题是当拆分字符串(如“Mrs and Mrs Smith”)时,拆分没有按计划进行,因为我在第一个文本框中得到“Mr”,在第二个文本框中得到“and Mrs Smith” 下面是我的函数,有人能帮我吗?如果有名字的话,我想要名字文本框和名字文本框

这是c#

我有两个文本框,分别是firstname和lastname。我希望将一个名称字符串拆分为它所属的相应文本框,但问题是名称字符串可能有多种组合。它可以是“Mr John Smith”或“Mr Smith”,因为我得到的结果是ok的,我现在遇到的问题是当拆分字符串(如“Mrs and Mrs Smith”)时,拆分没有按计划进行,因为我在第一个文本框中得到“Mr”,在第二个文本框中得到“and Mrs Smith”

下面是我的函数,有人能帮我吗?如果有名字的话,我想要名字文本框和名字文本框,如果字符串像“Mr and Mrs Smith”或“Mr&Mrs John Smith”,我想要名字文本框和名字文本框


您的问题是循环的逻辑不正确

首先检查标题是否匹配,如果不匹配,请在名称中的空格上拆分。这里的问题是,你不应该这样做,直到你检查了每一个标题

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

因此,类似这样的代码(未经测试的代码):


当然,这并没有考虑到你的书名列表远非详尽无遗,也没有包括你可能遇到的很多种类。史密斯先生和夫人怎么样?

您试图将输入的所有实例处理为
{firstname}{lastname}
形式。现在的现实是,你接受了大量不同形状和大小的输入。因此,您可以猛击您的头,试图迫使您的输入按您希望的方式运行,或者您可以调整和更改解决方案以适应输入

你将永远无法计算出名字、姓氏和头衔的所有可能组合。进入杜克·利奥波德·冯·豪斯克诺夫博士的人呢


我知道这不是你要找的答案,但你应该考虑以某种方式改变解决方案。也许把它放在一个单独的框中,或者让人们分别输入标题、名字和姓氏作为开头?

我觉得你的假设有些不恰当 例如:史密斯先生以先生的名字示人,但不正确 我建议使用其他方法输入您的数据,例如先生、女士的下拉列表。。。等
更多地考虑您的需求

您缺少的
dr
rev
!“史密斯夫妇”被称为“敬礼”。从个人姓名字段(例如头衔、名字、姓氏)派生称呼语更常见/更容易。这是你的选择吗?想象一下,你必须处理诸如“他的霍利内斯·约翰·保罗·塞孔德”或“苏阿尔特扎·真正的唐璜·卡洛斯·德博本·博本·多斯西西里”之类的事情。您需要的是所谓的“自然语言解析器”,这个问题仍在等待多项式或更好的解决方案。Mr&Mr或Mrs和Mrs呢?我添加了bool变量和break,但这只会从字符串“Mr和Mrs Smith”中删除Mr,因此txtFName的值为“and”,txtLName的值为“Mrs Smith”作为它的价值,我只希望史密斯出现在TXTLName中,是的,谢谢你提醒我前缀后面的句点,忘了它。@ifelabolz:是的,你的问题是
Mr
Mr和Mrs
的子字符串。您需要做的是首先通过重新排列数组来检查最具体的案例,以便最具体的案例(
Mr和Mrs
)出现在(
Mr
)之前。@ifelabolz:我已经更新了代码,以便首先对标题列表进行排序。首先检查最长的字符串应该可以解决子字符串问题。当然,将列表按正确的顺序排列会更有效。这不是输入,而是将已经存在的值传递到文本框中。为了将其用于需要名字和姓氏才能工作的外部软件,如果您无法控制用户如何或以何种方式输入他们的名字,并且您绝对需要能够在姓氏/姓氏上拆分它,那么您将有一个有趣的旅程。我祝你一切顺利,但我帮不了你。@ifelabolz:很公平,但安德斯的观点仍然站得住脚。您将不得不接受,您拥有的任何解决方案都将低于100%的准确度,您(或某个可怜的灵魂)将不得不手动检查数据的准确性。@MattBurland我知道我的解决方案不会100%准确,但这在某些情况下会有所帮助,Tahnks@AndersHolmström:)非常感谢
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;
  }
}
    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;
    }