【问题标题】:How to convert List<string> to List<int>?如何将 List<string> 转换为 List<int>?
【发布时间】:2011-06-01 12:41:40
【问题描述】:

我的问题是这个问题的一部分:

我从一个表单中收到一组 id。我需要获取密钥,将它们转换为整数并从数据库中选择匹配的记录。

[HttpPost]
public ActionResult Report(FormCollection collection)
{
    var listofIDs = collection.AllKeys.ToList();  
    // List<string> to List<int>
    List<Dinner> dinners = new List<Dinner>();
    dinners= repository.GetDinners(listofIDs);
    return View(dinners);
}

【问题讨论】:

    标签: c#


    【解决方案1】:
    listofIDs.Select(int.Parse).ToList()
    

    【讨论】:

    • 引发异常 - LINQ to Entities 无法识别“Int32 IndexOf(Char)”方法,并且该方法无法转换为存储表达式。 .net 4.0
    • @markthewizard1234 如果您的listofIDs 是尚未执行的IQueryable&lt;string&gt;,则会发生这种情况。在进行转换之前先使用ToList() 执行它:listofIDs.ToList().Select(int.Parse).ToList()
    • 我确信这在 2013 年有效,但这对我不再有效。在下面使用 linq 语句添加了一个较新的选项。
    • 如果任何字符串实际上不是整数,这将引发异常。请参阅下面的安全版本。 stackoverflow.com/a/48712010/2340825
    • @MichaelHornfeck 第一个 ToList 应该是 AsEnumerable,不需要分配第二个 List
    【解决方案2】:

    使用 Linq ...

    List<string> listofIDs = collection.AllKeys.ToList();  
    List<int> myStringList = listofIDs.Select(s => int.Parse(s)).ToList();
    

    【讨论】:

      【解决方案3】:

      这是一个过滤掉无效整数的安全变体:

      List<int> ints = strings
          .Select(s => Int32.TryParse(s, out int n) ? n : (int?)null)
          .Where(n => n.HasValue)
          .Select(n => n.Value)
          .ToList();
      

      它使用 C#7.0 引入的 out 变量。

      这个其他变体返回一个可为空的整数列表,其中为无效整数插入 null 条目(即,它保留原始列表计数):

      List<int?> nullableInts = strings
          .Select(s => Int32.TryParse(s, out int n) ? n : (int?)null)
          .ToList();
      

      【讨论】:

      【解决方案4】:

      什么没有 TryParse? 安全的 LINQ 版本,过滤掉无效的整数(对于 C# 6.0 及更低版本):

      List<int>  ints = strings
          .Select(s => { int i; return int.TryParse(s, out i) ? i : (int?)null; })
          .Where(i => i.HasValue)
          .Select(i => i.Value)
          .ToList();
      

      感谢 Olivier Jacot-Descombes 的想法和 C# 7.0 版本。

      【讨论】:

        【解决方案5】:

        使用 Linq:

        var intList = stringList.Select(s => Convert.ToInt32(s)).ToList()
        

        【讨论】:

        • var intList = stringList.Select(Convert.ToInt32).ToList()
        【解决方案6】:

        我知道这是旧帖子,但我认为这是一个很好的补充: 你可以使用List&lt;T&gt;.ConvertAll&lt;TOutput&gt;

        List<int> integers = strings.ConvertAll(s => Int32.Parse(s));
        

        【讨论】:

          【解决方案7】:

          将字符串值转换为整数列表

          var myString = "010"; 
          int myInt;
          List<int> B = myString.ToCharArray().Where(x => int.TryParse(x.ToString(), out myInt)).Select(x => int.Parse(x.ToString())).ToList();
          

          【讨论】:

            【解决方案8】:

            我认为这是最简单的方法:

            var listOfStrings = (new [] { "4", "5", "6" }).ToList();
            var listOfInts = listOfStrings.Select<string, int>(q => Convert.ToInt32(q));
            

            【讨论】:

            • 我经常在 lambda 表达式中看到这种模式:x => someMethod(x)。你知道你应该用 someMethod 代替它。这样,您的示例就变为 listOfStrings.Select(Convert.ToInt32);。这可能更具可读性,更快,更短,我是否已经提到过更优雅?回答这个问题的所有其他人也是如此。
            • 我在省略箭头语法时遇到错误。这有效:List&lt;string&gt; sss = new List&lt;string&gt;();IEnumerable&lt;int&gt; test1 = sss.Select&lt;string, int&gt;(x =&gt; Convert.ToInt32(x)); 但无效:IEnumerable&lt;int&gt; test2 = sss.Select&lt;string, int&gt;(Convert.ToInt32); 错误是 string,int,intstring,int 版本的 Select 之间的模糊调用。
            【解决方案9】:

            对于这个简单的问题,这可能是多余的。但是对于与 Linq 相关的 Try-Do 方法,我倾向于使用匿名类来获得更具表现力的代码。类似于Olivier Jacot-DescombesBA TabNabber的回答:

            List<int> ints = strings
                .Select(idString => new { ParseSuccessful = Int32.TryParse(idString, out var id), Value = id })
                .Where(id => id.ParseSuccessful)
                .Select(id => id.Value)
                .ToList();
            

            【讨论】:

              【解决方案10】:

              实现此目的的另一种方法是使用 linq 语句。推荐的答案在.NetCore2.0 中对我不起作用。但是,我能够弄清楚,如果您使用更新的技术,下面的内容也可以使用。

              [HttpPost]
              public ActionResult Report(FormCollection collection)
              {
                  var listofIDs = collection.ToList().Select(x => x.ToString());
                  List<Dinner> dinners = new List<Dinner>();
                  dinners = repository.GetDinners(listofIDs);
                  return View(dinners);
              }
              

              【讨论】:

                【解决方案11】:
                yourEnumList.Select(s => (int)s).ToList()
                

                【讨论】:

                • 嗨帕特里克。欢迎来到 StackOverflow。如果您可以对您发布的非常简洁的解决方案进行更多描述,那就更好了。这是对本网站上一个非常古老的问题的回答,将由多个用户进行审查。
                【解决方案12】:

                您可以通过 LINQ 使用它

                     var selectedEditionIds = input.SelectedEditionIds.Split(",").ToArray()
                                            .Where(i => !string.IsNullOrWhiteSpace(i) 
                                             && int.TryParse(i,out int validNumber))
                                            .Select(x=>int.Parse(x)).ToList();
                

                【讨论】:

                • 对于 TryParse 来说似乎很浪费,它为您提供了值,然后只需将该值扔出窗口然后执行 Parse。你本质上是双重解析。
                【解决方案13】:
                intList = Array.ConvertAll(stringList, int.Parse).ToList();
                

                【讨论】:

                  【解决方案14】:

                  这会将字符串数组转换为长数组。它返回成功转换的值的数量。

                  public static int strv_to_longv(string[] src, int src_offset, long[] dst, int dst_offset)
                  {
                      int i = src_offset;
                      int j = dst_offset;
                      int ni = src.Length;
                      int nj = dst.Length;
                      while ((i < ni) && (j < nj))
                      {
                          j += long.TryParse(src[i], out dst[j]) ? 1 : 0;
                          i++;
                      }
                      return j;
                  }
                  
                  var line = "lemon 4 grape 1 garlic 77";
                  string[] words = line.Split(' ');
                  long[] longs = new long[10];
                  int l = strv_to_longv(words, 1, longs, 0);
                  //longs will be equal {4, 1, 77}
                  //l will be equal 3
                  

                  【讨论】:

                    【解决方案15】:
                      public List<int> ConvertStringListToIntList(List<string> list) 
                      {
                         List<int> resultList = new List<int>();
                         for (int i = 0; i < list.Count; i++)
                            resultList.Add(Convert.ToInt32(list[i]));
                    
                         return resultList;
                      }
                    

                    【讨论】:

                    • 考虑添加一些关于你的答案的文字解释,而不是只提供代码。
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-07-28
                    • 2011-05-29
                    • 2011-11-19
                    • 2012-11-22
                    • 1970-01-01
                    • 2020-01-11
                    相关资源
                    最近更新 更多