如何将Ilist铸造到ArrayList
本文关键字:ArrayList Ilist | 更新日期: 2023-09-27 18:19:52
我可以将IList
转换为ArrayList
吗?
如果是,我该怎么办?
IList alls = RetrieveCourseStudents(cf);
ArrayList a = (ArrayList)alls;
这是正确的吗?
is有错误:
无法强制转换类型的对象
正如评论中所建议的,您应该考虑使用泛型集合而不是
List<Student> students = RetrieveCourseStudents(cf).Cast<Student>().ToList()
只有当alls
已经是ArrayList
,即RetrieveCourseStudents
返回的对象是ArrayList
时,才可以将其强制转换为ArrayList
。
如果不是,那么你需要创建一个新的对象,幸运的是ArrayList
有一个构造函数可以做到这一点:new ArrayList(RetrieveCourseStudents(cf))
值得注意的是,现在应该使用泛型(如List<T>
)而不是ArrayList
,所以除非你需要与一些无法更新的旧代码交互,否则我会远离它
这都是关于多态性的。ArrayList是接口IList的实现。
IList iList = new ArrayList();
变量iList的静态类型是iList,但它引用了ArrayList对象!
从IList到ArrayList没有真正的强制转换,因为您不能从接口或抽象类实例化/创建对象。
是,只有当RetrieveCourseStudents(cf)返回ArrayList类型时,我们才能将IList强制转换为ArrayList。
例如
static void Main(string[] args)
{
IList test1 = GetList();
IList test2= GetIList();
ArrayList list1 = (ArrayList)test1; // Fails
ArrayList list2 = (ArrayList)test2; // Passes
Console.ReadKey();
}
private static IList GetIList()
{
return new ArrayList();
}
private static IList GetList()
{
return new CustomList();
}
由于您评论说您只想对返回的列表进行排序(在另一个评论中,您说该列表的类型为EntityCollection<CourseStudent>
),因此不需要强制转换为ArrayList
,只需直接使用该值即可。
您可以使用OrderBy
LINQ扩展方法(您使用的变量类型-IList
也不合适)。
这将满足您的需求(其中CourseStudentProperty
是CourseStudent
的属性):
var alls = RetrieveCourseStudents(cf);
var orderedAlls = alls.OrderBy(cs => cs.CourseStudentProperty);
using System;
using System.Collections;
using System.Collections.Generic;
namespace MyILists
{
class Program
{
static void Main(string[] args)
{
IList<int> intArrayList = new ArrayList().ToIList<int>();
intArrayList.Add(1);
intArrayList.Add(2);
//intArrayList.Add("Sample Text"); // Will not compile
foreach (int myInt in intArrayList)
{
Console.WriteLine(" Number : " + myInt.ToString());
}
Console.Read();
}
}
public static class MyExtensions
{
public static IList<T> ToIList<T>(this ArrayList arrayList)
{
IList<T> list = new List<T>(arrayList.Count);
foreach (T instance in arrayList)
{
list.Add(instance);
}
return list;
}
}
}
只需使用以下简单代码:)
(From x In list).ToArray
您可以使用LINQ Union扩展。
请注意,您可以将任何类型的IEnumerable与此技术(Array、IList等)相结合,因此您不必担心"Add"方法。您必须了解LINQ正在生成不可变的结果,因此如果您想随后操作集合,则需要使用"ToList()"、"ToDictionary()"或其他任何方法
var list =
(IList<Student>) new []
{
new Student {FirstName = "Jane"},
new Student {FirstName = "Bill"},
};
var allStudents = list.Union(
new [] {new Student {FirstName = "Clancey"}})
.OrderBy(s => s.FirstName).ToList();
allStudents[0].FirstName = "Billy";
foreach (var s in allStudents)
{
Console.WriteLine("FirstName = {0}", s.FirstName);
}
输出:
FirstName = Billy
FirstName = Clancey
FirstName = Jane