【问题标题】:Add string to List<string>将字符串添加到 List<string>
【发布时间】:2013-09-10 10:46:05
【问题描述】:

我正在研究一种方法,该方法接受一个字符串并将其分成多个项目,然后将其存储在一个数组中。然后,我执行检查以查看数组是否包含两个以上的项目,如果包含,我将数组中的特定项目分配给相应的字符串,即将第一项分配给名字,最后一项分配给姓氏,所有其他项目分配给中间名。

我的问题与检索数组中不是第一个或最后一个项目的每个项目有关,然后以正确的顺序将它们分配给一个字符串。下面你可以看到我试图抓取名称数组中的每个项目并将结果分配给一个列表,然后可以将其转换为单个字符串,但没有运气。我正在寻找的是解决这个问题的方法。

    public string SplitName(string text)
    {
        string forename;
        string middlename;
        string surname;

        var name = text.Split(' ');

        if (name != null)
        {
            if (name.Length > 2)
            {
                forename = name[0];
                surname = name[name.Length - 1];

                List<string> temp = new List<string>();

                for (int i = 1; i < name.Length - 1; i++)
                {
                    // Assign each item to middlename
                }

                text = string.Format("{0} {1} {2}", forename, middlename, surname);
            }
        }
        else
        {
            text = "INVALID";
        }

        return text;
    }

【问题讨论】:

  • 您有示例输入吗?怎么了?出错了?
  • 我认为text.Split() 永远不会返回 null。如果text 为null,则抛出异常,如果为空,则返回一个包含单个空项的数组。
  • @Magnus,我完全忽略了这一点,感谢您的提醒。
  • @Sayse 我收到了解决问题的多种方法的错误,因为我无法弄清楚如何实际解决问题,这就是我要求解决问题的原因。

标签: c# arrays string list loops


【解决方案1】:

使用 String.Join (http://msdn.microsoft.com/en-us/library/tk0xe5h0.aspx)

public string SplitName(string text)
{
    string forename;
    string middlename;
    string surname;

    var name = text.Split(' ');

    if (name != null)
    {
        if (name.Length > 2)
        {
            forename = name[0];
            surname = name[name.Length - 1];

            middlename = string.Join(" ", name, 1, name.Length - 2);

            text = string.Format("{0} {1} {2}", forename, middlename, surname);
        }
    }
    else
    {
        text = "INVALID";
    }

    return text;
}

如果您希望它们使用不同的字符串连接,请更改连接的第一个参数 (" ")。目前一个名字“Bob Jack Willis Mills”将创建一个中间名“Jack Willis”。如果你想要 "Jack, Willis" 使用 ", " 作为分隔符。

【讨论】:

    【解决方案2】:

    如果您只想分别保留第一个和最后一个标记,并将其他所有内容视为中间名,那么使用正则表达式会更简单:

    var regex = new Regex(@"^(\S+)\s+(?:(.*?)(?:\s+)?)(\S+)$");
    var match = regex.Match("foo bar baz");
    
    if (match.Success) {
        var firstName = match.Groups[1].Value;
        var middleName = match.Groups[2].Value;
        var lastName = match.Groups[3].Value;
    }
    else {
        // there were no spaces, i.e. just one token
    }
    

    正则表达式匹配两个以\S+结尾的非空格字符。它可以选择使用模式(?:(.*?)(?:\s+)?) 匹配它们之间发生的任何其他内容,其中重要的部分是(.*?)(匹配任何内容,非贪婪,以免在姓氏之前咀嚼任何空格),其余部分是主要是繁文缛节(非捕获组,姓氏前的可选空格)。

    【讨论】:

      【解决方案3】:

      试试这个:

      public string SplitName(string text)
      {
          string forename;
          string middlename;
          string surname;
      
          var name = text.Split(' ');
      
          if (name != null)
          {
              if (name.Length > 2)
              {
                  forename = name[0];
                  surname = name[name.Length - 1];
                  middlename = string.Join(" ", name.Skip(1).Take(name.Length - 2));
      
                  text = string.Format("{0} {1} {2}", forename, middlename, surname);
              }
          }
          else
          {
              text = "INVALID";
          }
      
          return text;
      }
      

      但这会返回完全相同的字符串。

      【讨论】:

        【解决方案4】:

        首先,您需要初始化字符串变量,然后您可以将所有“中间”项附加到它。

            public string SplitName(string text)
            {
                string forename = string.Empty;
                string middlename = string.Empty;
                string surname = string.Empty;
        
                var name = text.Split(' ');
        
                if (name != null)
                {
                    if (name.Length > 2)
                    {
                        forename = name[0];
                        surname = name[name.Length - 1];
        
                        List<string> temp = new List<string>();
        
                        for (int i = 1; i < name.Length - 1; i++)
                        {
                            middlename += name[i];
                        }
        
                        text = string.Format("{0} {1} {2}", forename, middlename, surname);
                    }
                }
                else
                {
                    text = "INVALID";
                }
        
                return text;
            }
        

        【讨论】:

          【解决方案5】:

          这会将所有中间名添加到以空格分隔的中间名并修剪最后一个空格

          for (int i = 1; i < name.Length - 1; i++)
          {
              middlename+=name[i]+" ";
          }
          middlename = middlename.Trim(); // just for sure
          

          如果您需要其他内容,请说明您的问题

          如果你的名字是

          aa bb cc dd ee

          中间名将是

          bb cc dd

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-10-04
            • 1970-01-01
            • 2012-09-14
            • 2012-12-26
            • 2015-07-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多