繁体   English   中英

如何将Ilist转换为ArrayList?

[英]How To Cast Ilist To ArrayList?

我可以将IList转换为ArrayList吗?

如果是的话我该怎么办?

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

那是对的吗?

有错误:

无法转换类型的对象

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

List<Student> students = RetrieveCourseStudents(cf).Cast<Student>().ToList() 

你只能将投alls一个ArrayList ,如果它已经是一个ArrayList ,即如果返回的对象RetrieveCourseStudents是一个ArrayList

如果不是那么你需要创建一个新对象,幸运的是ArrayList有一个构造函数可以做到这一点: new ArrayList(RetrieveCourseStudents(cf))


值得注意的是,您现在应该使用泛型(例如List<T> )而不是ArrayList ,所以除非您需要与一些无法更新的旧代码进行交互,否则我会远离它。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM