ArrayList
BookingData
到List<BookingData>
?
我正在使用.net 2.0,所以我不能使用arrayList.Cast<int>().ToList()
,我不想在这里做foreach循环,你有更好的想法吗?
感谢。
答案 0 :(得分:11)
请注意某些将必须枚举数组列表以构造List<T>
;它只是你自己做或将其留给其他(框架/实用程序)方法的问题。
如果这是一次性的,您希望避免的解决方案(使用“就地”foreach
循环进行转换)是一个非常合理的选择。如果你发现自己经常这样做,你可以把它提取到一个通用的实用方法中,就像在cdhowie的回答中一样。
如果您的限制仅限于目标 .NET 2.0(但可以使用C#3),请考虑LINQBridge,这是LINQ to Objects for的重新实现。 NET 2.0。这样您就可以使用自己提供的Cast
样本而无需更改。它也适用于C#2,但你不会从扩展方法语法,更好的类型推断等中获益。
如果您不关心性能,也不想编写实用程序方法的麻烦,可以使用内置的 ArrayList.ToArray
方法通过创建一个与List<T>
兼容的中间数组来帮助解决这个问题(这不比foreach短得多):
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迭代器块更简洁,更简单。