我可以将IList
投放到ArrayList
吗?
如果是,我该怎么办?
IList alls = RetrieveCourseStudents(cf);
ArrayList a = (ArrayList)alls;
这是对的吗?
有错误:
无法转换
类型的对象
答案 0 :(得分:4)
正如评论中所建议的那样,您应该考虑使用通用集合
List<Student> students = RetrieveCourseStudents(cf).Cast<Student>().ToList()
答案 1 :(得分:4)
如果alls
已经是ArrayList
,您只能将RetrieveCourseStudents
投射到ArrayList
,即ArrayList
返回的对象是{{1} }}
如果不是,那么您需要创建一个新对象,幸运的是new ArrayList(RetrieveCourseStudents(cf))
有ArrayList
可以执行此操作:ArrayList
值得注意的是,你现在应该使用泛型(例如constructor)而不是{{1}},所以除非你需要与一些无法更新的旧代码进行交互,否则我会远离它。
答案 2 :(得分:0)
是, 只有当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();
}
答案 3 :(得分:0)
这完全是关于多态性的。 ArrayList是接口IList 的实现。
IList iList = new ArrayList();
变量iList中的静态类型是 IList ,但它引用了一个ArrayList对象!
从IList到ArrayList没有真正的转换,因为你无法从Interface或abstract Class实例化/创建Object。
答案 4 :(得分:0)
由于您评论说您只想订购返回的列表(在另一个评论中,您说的是EntityCollection<CourseStudent>
类型) - 您不需要转换为ArrayList
,而只需使用该值直接
您可以使用OrderBy
LINQ扩展方法(您使用的变量类型 - IList
也不适用。)
这可以满足您的需求(CourseStudentProperty
是CourseStudent
的属性):
var alls = RetrieveCourseStudents(cf);
var orderedAlls = alls.OrderBy(cs => cs.CourseStudentProperty);
答案 5 :(得分:0)
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;
}
}
}
答案 6 :(得分:0)
只需使用这个简单的代码:)
(From x In list).ToArray
答案 7 :(得分:0)
您可以使用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