如何将Ilist铸造到ArrayList

本文关键字:ArrayList Ilist | 更新日期: 2023-09-27 18:19:52

我可以将IList转换为ArrayList吗?

如果是,我该怎么办?

IList alls = RetrieveCourseStudents(cf);
ArrayList a = (ArrayList)alls;

这是正确的吗?

is有错误:

无法强制转换类型的对象

如何将Ilist铸造到ArrayList

正如评论中所建议的,您应该考虑使用泛型集合而不是

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也不合适)。

这将满足您的需求(其中CourseStudentPropertyCourseStudent的属性):

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