如何将Ilist转换为ArrayList?

时间:2012-01-07 14:59:46

标签: c# asp.net casting

我可以将IList投放到ArrayList吗?

如果是,我该怎么办?

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

这是对的吗?

有错误:

  

无法转换

类型的对象

8 个答案:

答案 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也不适用。)

这可以满足您的需求(CourseStudentPropertyCourseStudent的属性):

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