在.Net 2.0中从ArrayList转换为List的最佳方法是什么

时间:2010-12-14 08:13:06

标签: c# .net-2.0

ArrayList BookingDataList<BookingData>

我正在使用.net 2.0,所以我不能使用arrayList.Cast<int>().ToList(),我不想在这里做foreach循环,你有更好的想法吗?

感谢。

5 个答案:

答案 0 :(得分:11)

请注意某些将必须枚举数组列表以构造List<T>;它只是你自己做或将其留给其他(框架/实用程序)方法的问题。

  1. 如果这是一次性的,您希望避免的解决方案(使用“就地”foreach循环进行转换)是一个非常合理的选择。如果你发现自己经常这样做,你可以把它提取到一个通用的实用方法中,就像在cdhowie的回答中一样。

  2. 如果您的限制仅限于目标 .NET 2.0(但可以使用C#3),请考虑LINQBridge,这是LINQ to Objects for的重新实现。 NET 2.0。这样您就可以使用自己提供的Cast样本而无需更改。它也适用于C#2,但你不会从扩展方法语法,更好的类型推断等中获益。

  3. 如果您不关心性能,也不想编写实用程序方法的麻烦,可以使用内置的 ArrayList.ToArray 方法通过创建一个与List<T>兼容的中间数组来帮助解决这个问题(这不比foreach短得多):


  4. ArrayList arrayList = ...
    
    // Create intermediary array
    BookingData[] array = (BookingData[]) arrayList.ToArray(typeof(BookingData));
    
    // Create the List<T> using the constructor that takes an IEnumerable<T>
    List<BookingData> list = new List<BookingData>(array);
    

    最后,我建议,如果可能的话,放弃使用过时的非泛型集合类。

答案 1 :(得分:2)

让我们保持简单:

// untested
List<T> ConvertArrayList<T>(ArrayList data)
{
    List<T>  result = new List<T> (data.Count);
    foreach (T item in data)
      result.Add(item);
    return result;
}

...

List<BookingData> newList = ConvertArrayList<BookingData>(oldList);

答案 2 :(得分:1)

使用此方法:

public static List<T> ConvertToList<T>(ArrayList list)
{
    if (list == null)
        throw new ArgumentNullException("list");

    List<T> newList = new List<T>(list.Count);

    foreach (object obj in list)
        newList.Add((T)obj);

    // If you really don't want to use foreach:
    // for (int i = 0; i < list.Count; i++)
    //     newList.Add((T)list[i]);

    return newList;
}

然后你可以:

List<BookingData> someList = ConvertToList<BookingData>(someArrayList);

答案 3 :(得分:0)

您必须使用foreach

        foreach (Object item in list1)
        {
            list2.Add((BookingData)item);
        }

答案 4 :(得分:0)

ToList()方法只是用于创建List表示的Synthetic sugar,但在内部它也使用循环来生成列表项。

因此使用foreach迭代器块更简洁,更简单。