[英]How To Cast Ilist To ArrayList?
我可以将IList
转换为ArrayList
吗?
如果是的话我该怎么办?
IList alls = RetrieveCourseStudents(cf);
ArrayList a = (ArrayList)alls;
那是对的吗?
有错误:
无法转换类型的对象
正如评论中所建议的那样,您应该考虑使用泛型集合
List<Student> students = RetrieveCourseStudents(cf).Cast<Student>().ToList()
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等)结合使用,因此您无需担心“添加”方法。 您必须了解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
是的,只有当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();
}
这完全是关于多态性的。 ArrayList是Interface IList的一个实现。
IList iList = new ArrayList();
变量iList中的静态类型是IList,但它引用了一个ArrayList对象!
从IList到ArrayList没有真正的转换,因为您无法从Interface或abstract Class实例化/创建Object。
由于您评论说您只想订购返回的列表(在另一个注释中,您说的类型为EntityCollection<CourseStudent>
) - 您不需要转换为ArrayList
而只需直接使用该值。
您可以使用OrderBy
LINQ扩展方法(以及您使用的变量类型 - IList
也不适合)。
这将满足您的需求(其中工作CourseStudentProperty
是一个属性CourseStudent
):
var alls = RetrieveCourseStudents(cf);
var orderedAlls = alls.OrderBy(cs => cs.CourseStudentProperty);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.