如何在不使用 foreach 的情况下将 ArrayList 转换为强类型泛型列表?

Posted

技术标签:

【中文标题】如何在不使用 foreach 的情况下将 ArrayList 转换为强类型泛型列表?【英文标题】:How to convert an ArrayList to a strongly typed generic list without using a foreach? 【发布时间】:2010-10-21 15:19:35 【问题描述】:

请参阅下面的代码示例。我需要ArrayList 是一个通用列表。我不想使用foreach

ArrayList arrayList = GetArrayListOfInts();  
List<int> intList = new List<int>();  

//Can this foreach be condensed into one line?  
foreach (int number in arrayList)  
  
    intList.Add(number);  
  
return intList;    

【问题讨论】:

如果您不确定 arrayList 仅包含预期类型,请过滤它们 arrayList.OfType().ToList()。见***.com/a/7845009/52277 【参考方案1】:

试试下面的

var list = arrayList.Cast<int>().ToList();

这仅在使用 C# 3.5 编译器时才有效,因为它利用了 3.5 框架中定义的某些扩展方法。

【讨论】:

虽然我自己之前确实使用过这个,但我正在考虑装箱/拆箱。这不会从表演中撤回吗?有时我发现漂亮的代码是以牺牲速度和资源为代价的...... 这只是首先将其放入 ArrayList 的结果。仅将每个成员都转换回 int 几乎是您在性能方面可以做到的最好的。 @mquander,真的,真的......我刚刚意识到 OP 帖子中的 for 循环也可以做到这一点。 =) 不知何故,我错过了 System.Linq 命名空间中的 Cast。我编写了自己的扩展方法,现在可以删除。谢谢!【参考方案2】:

这是低效的(它不必要地创建了一个中间数组)但简洁并且适用于 .NET 2.0:

List<int> newList = new List<int>(arrayList.ToArray(typeof(int)));

【讨论】:

我做了arrayList.ToArray(typeof(int)) as int[] 然后它工作了谢谢! +1【参考方案3】:

使用扩展方法怎么样?

来自http://www.dotnetperls.com/convert-arraylist-list:

using System;
using System.Collections;
using System.Collections.Generic;

static class Extensions

    /// <summary>
    /// Convert ArrayList to List.
    /// </summary>
    public static List<T> ToList<T>(this ArrayList arrayList)
    
        List<T> list = new List<T>(arrayList.Count);
        foreach (T instance in arrayList)
        
            list.Add(instance);
        
        return list;
    

【讨论】:

【参考方案4】:

在 .Net 标准 2 中使用 Cast&lt;T&gt; 是更好的方法:

ArrayList al = new ArrayList();
al.AddRange(new[]"Micheal", "Jack", "Sarah");
List<int> list = al.Cast<int>().ToList();

CastToListSystem.Linq.Enumerable 类中的扩展方法。

【讨论】:

以上是关于如何在不使用 foreach 的情况下将 ArrayList 转换为强类型泛型列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 InterfaceBuilder 的情况下将 UISwitch(切换开关)添加到 UIToolBar

如何在不使用任何付费工具的情况下将 dbf 文件导入 mysql?

如何在不使用 ToString() 的情况下将 Int 转换为 C# 中的字符串?

如何在不使用 span 标签的情况下将颜色赋予 *

如何在不使用 BIOS 的情况下将数据写入显卡?

如何在不使用循环的情况下将json分配给另一个[重复]