【问题标题】:Cast List<int> to List<string> in .NET 2.0在 .NET 2.0 中将 List<int> 转换为 List<string>
【发布时间】:2008-09-04 23:06:56
【问题描述】:

你能以某种方式将List&lt;int&gt; 转换为List&lt;string&gt; 吗?

我知道我可以循环使用 .ToString() 这个东西,但是演员阵容会很棒。

我在 C# 2.0 中(所以没有LINQ)。

【问题讨论】:

    标签: c# generics casting


    【解决方案1】:

    .NET 2.0 有 ConvertAll 方法,您可以在其中传入转换器函数:

    List<int>    l1 = new List<int>(new int[] { 1, 2, 3 } );
    List<string> l2 = l1.ConvertAll<string>(delegate(int i) { return i.ToString(); });
    

    【讨论】:

      【解决方案2】:

      2010 年更新

      List<int> l1 = new List<int>(new int[] { 1,2,3 } );
      List<string> l2 = l1.ConvertAll<string>(x => x.ToString());
      

      【讨论】:

      • 谢谢!这为我节省了大量时间
      • 不,lambdas 是在 C# 3.0 中引入的,所以这在 2.0 中不起作用。
      • 我发现它适用于 VS2008 和 .NET 2.0,只要您至少安装了 .NET 3.0。见stackoverflow.com/questions/3341846/…
      • 人们应该区分 .NET 版本和 C# 版本。由于箭头x =&gt; x.ToString() 被编译为与delegate(int x) { return x.ToString(); } 相同类型的IL,在这种情况下,重要的是要有一个知道=&gt; 是什么的C# 编译器(C# 版本)。框架和运行时(.NET 版本)不需要特殊功能,所以 .NET 2.0 在这里就可以了。
      • 原来你可以放弃&lt;string&gt;,它仍然有效。让它只是l1.ConvertAll(x =&gt; x.ToString());
      【解决方案3】:

      C# 2.0 能做到List&lt;T&gt;.Convert 吗?如果是这样,我认为您最好的猜测是将其与代表一起使用:

      List<int> list = new List<int>();
      list.Add(1);
      list.Add(2);
      list.Add(3);
      list.Convert(delegate (int i) { return i.ToString(); });
      

      类似的东西。


      支持 Glenn 的答案,这可能是正确的代码 ;-)

      【讨论】:

        【解决方案4】:

        你可以使用:

        List<int> items = new List<int>(new int[] { 1,2,3 } );
        List<string> s = (from i in items select i.ToString()).ToList();
        

        【讨论】:

          【解决方案5】:

          由于不存在从 int 到字符串的显式或隐式转换,因此您将无法直接转换它,它 必须 是一个涉及 .ToString() 的方法,例如:-

          foreach (int i in intList) stringList.Add(i.ToString());
          

          编辑 - 或者正如其他人相当出色地指出的那样,使用 intList.ConvertAll(delegate(int i) { return i.ToString(); });,但显然你仍然必须使用.ToString() 它是一种转换而不是强制转换。

          【讨论】:

          • 泛型类型之间的转换的存在与投影之间的转换能力无关。 IE,即使int 隐式或显式转换为string,这并不意味着List&lt;int&gt; 隐式或显式转换为List&lt;string&gt;
          【解决方案6】:

          result = listOfInt.Select(i =&gt; i.ToString(CultureInfo.InvariantCulture)).ToList()

          将参数 result 和 listOfInt 替换为您的参数

          【讨论】:

          • 对我来说工作正常 result = listOfInt.Select(i => i.ToString()).ToList();
          【解决方案7】:

          你必须建立一个新的列表。 List&lt;int&gt;List&lt;string&gt; 的底层位表示完全不兼容——例如,在 64 位平台上,各个成员的大小甚至都不相同。

          理论上可以将List&lt;string&gt; 视为List&lt;object&gt; - 这将带您进入令人兴奋的协变和逆变世界,目前C# 或VB.NET 不支持。

          【讨论】:

          • @Curt: > 理论上可以将 > 一个 List 视为一个 List -- > 这会让你进入令人兴奋的世界 > 协变和逆变,并且 > 是C# 或 > VB.NET 当前不支持 C# 和 .NET 实际上支持协方差。只是没有泛型。
          【解决方案8】:

          除了通常的 ToString() 之外,还可以通过两种额外的方式将 int List 转换为 string List。选择你更喜欢的那个。

          var stringlist = intlist.Select(x=>""+x).ToList();
          

          也可以:

          var stringlist = intlist.Select(x=>$"{x}").ToList();
          

          最后是传统的:

          var stringlist = intlist.Select(x=>x.ToString()).ToList();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多