【问题标题】:How can I convert comma separated string into a List<int> [duplicate]如何将逗号分隔的字符串转换为 List<int> [重复]
【发布时间】:2012-02-15 20:58:37
【问题描述】:
string tags = "9,3,12,43,2"

List<int> TagIds = tags.Split(',');

这不起作用,因为 split 方法返回一个字符串[]

【问题讨论】:

    标签: c# .net string list


    【解决方案1】:

    这是一种方法:

    List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();
    

    【讨论】:

    • 也可以是List&lt;int&gt; TagIds = new List&lt;int&gt;(tags.Split(',').Select(int.Parse));
    • 是否需要new List&lt;&gt;
    • @LiquidPony 没有;你可以打电话给ToList();结果基本上是一样的:List&lt;int&gt; TagIds = tags.Split(',').Select(int.Parse).ToList(); 不过,你需要做一个或另一个,因为Select() 的返回值是IEnumerable&lt;&gt;,而不是List&lt;&gt;
    • @LiquidPony 在这个实现中是的,因为在这种情况下 Select 扩展返回 IEnumerable&lt;Int32&gt; 并且它不在列表中。然而 list 有一个构造函数接受另一个集合作为源。
    • 要处理标签为空字符串的情况,请使用Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
    【解决方案2】:

    如果你想包含一些简单的验证并跳过无效值(而不是抛出异常),这里有一些使用 TryParse 的东西:

    string csv = "1,2,3,4,a,5";
    int mos = 0;
    var intList = csv.Split(',')
                        .Select(m => { int.TryParse(m, out mos); return mos; })
                        .Where(m => m != 0)
                        .ToList();
    
    //returns a list with integers: 1, 2, 3, 4, 5
    

    编辑:这是根据 Antoine 的反馈更新的查询。它首先调用 TryParse 以过滤掉任何错误值,然后调用 Parse 进行实际转换。

    string csv = "1,2,3,4,a,5,0,3,r,5";
    int mos = 0;
    var intList = csv.Split(',')
                        .Where(m => int.TryParse(m, out mos))
                        .Select(m => int.Parse(m))
                        .ToList();
    
    //returns a list with integers: 1, 2, 3, 4, 5, 0, 3, 5
    

    编辑 2:感谢 Charles Burns 的反馈,更新了 C# 7.0 查询。请注意,我们用这种方法去掉了额外的 mos 变量,所以它更干净一些。

    string csv = "1,2,3,4,a,5,0,3,r,5";
    var intList = csv.Split(',')
                     .Where(m => int.TryParse(m, out _))
                     .Select(m => int.Parse(m))
                     .ToList();
    

    【讨论】:

    • 如果 0 是一个合法输入则失败!
    • 在 C# 7.0 中,您可以省略 mos 的声明并将 TryParse 调用替换为 int.TryParse(m, out int _)
    • 可以进一步简化为 return str.Split(',').Where(m => int.TryParse(m, out int _)).Select(int.Parse).ToList() ;
    【解决方案3】:

    您可以使用带有int.Parse() 的LINQ 将string[] 转换为IEnumerable&lt;int&gt;,然后将该结果传递给List&lt;T&gt; 构造函数:

    var tagIds = new List<int>(tags.Split(',').Select(s => int.Parse(s)));
    

    【讨论】:

      【解决方案4】:

      一点 LINQ 大有帮助:

       List<int> TagIds = tags.Split(',')
               .Select(t => int.Parse(t))
               .ToList();
      

      【讨论】:

        【解决方案5】:

        不使用LINQ Query,可以选择这种方式,

        string tags = "9,3,12,43,2";
        List<string> numbers = nos.Split(',').ToList<string>();
        

        然后你就可以把这个List转成整数类型了……

        【讨论】:

        • 只是给不熟悉的人的便条 = .ToList&lt;string&gt;() 仍然需要using System.Linq;
        【解决方案6】:
        string tags = "9,3,12,43,2"
        
        List<int> TagIds = tags.Split(',').Select(x => x.Trim()).Select(x=> Int32.Parse(x)).ToList();
        

        【讨论】:

        【解决方案7】:

        如果你使用的是 C# 3.5,你可以使用 Linq 来实现这一点

        string tags = "9,3,12,43,2";
        List<int> tagIds = tags.Split(',').Select(s=>int.Parse(s)).ToList();
        

        或短的

        string tags = "9,3,12,43,2";
        List<int> tagIds = tags.Split(',').Select(int.Parse).ToList();
        

        【讨论】:

          【解决方案8】:
          string tags = "9,3,12,43,2";
          List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();
          

          【讨论】:

            【解决方案9】:

            我对 khalid13 的回答进行了修改。如果用户输入一个字符串“0”,他的回答会将其从结果列表中删除。我做了类似的事情,但使用了一个匿名对象。

            var result = commaSeparatedString.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                        .Select(s => new { didConvert = int.TryParse(s.TrimNullProtection(), out convertedInt), convertedValue = convertedInt })
                        .Where(w => w.didConvert)
                        .Select(s => s.convertedValue)
                        .ToList();
            

            TrimNullProtection 是我制作的一个自定义函数,用于保护字符串是否为空。

            上面所做的就是删除任何无法正确转换的字符串。如果您需要在转换出现问题时出错,那么接受的答案应该可以解决问题。

            【讨论】:

              【解决方案10】:

              我偶然发现了这一点,我只想在没有 linq 的情况下分享我自己的解决方案。这是一种原始方法。非整数值也不会添加到列表中。

              List<int> TagIds = new List<int>();
              string[] split = tags.Split(',');
              foreach (string item in split)
              {
                  int val = 0;
                  if (int.TryParse(item, out val) == true)
                  {
                      TagIds.Add(val);
                  }
              }
              

              希望这会有所帮助。

              【讨论】:

                【解决方案11】:

                这很简单。首先拆分字符串。 修剪逗号(,)后的空格。 然后使用系统定义的 ToList()

                string inputText = "text1, text2"
                

                删除“,”后的空格并将此逗号分隔的文本转换为列表

                List<string> resultList = (inputText.Split(',')).Select(t => t).ToList();
                

                【讨论】:

                  猜你喜欢
                  • 2012-02-03
                  • 1970-01-01
                  • 2018-08-16
                  • 2018-07-14
                  • 2013-10-23
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多