2012-01-07 65 views
4

我可以將IList轉換成ArrayList如何將Ilist投射到ArrayList?

如果是,我該怎麼辦?

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

這是正確的嗎?

是有錯誤:

Unable to cast object of type

+7

什麼類型不'RetrieveCourseStudents'返回?你爲什麼需要將它轉換爲'ArrayList'?你不應該在新代碼中使用'ArrayList',而是使用泛型集合。 – Oded 2012-01-07 15:01:20

+0

public EntityCollection RetrieveCourseStudents(CF cf); – 2012-01-07 15:29:06

+0

你爲什麼要把它轉換成'ArrayList'? – Oded 2012-01-07 15:30:13

回答

0

這是所有關於多態性。 ArrayList是來自接口IList的實現。

IList iList = new ArrayList(); 

從變量ILIST靜態類型爲IList的但它引用了一個ArrayList對象!

沒有從IList到ArrayList的真實轉換,因爲您無法從接口或抽象類實例化/創建對象。

4

正如意見建議,你應該考慮使用泛型集合而不是

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

Tanx非常多.... – 2012-01-07 15:30:16

4

你只能將投allsArrayList如果它已經是ArrayList,即如果由RetrieveCourseStudents返回的對象是ArrayList

如果沒有,那麼你需要創建一個新的對象,luckly ArrayListconstructor可以做到這一點:new ArrayList(RetrieveCourseStudents(cf))


值得一提的是,你應該使用泛型(如List<T>)而不是現在的ArrayList,所以除非你需要與一些無法更新的舊代碼進行交互,否則我會遠離它。

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(); 
     } 
0

既然您評論說您只是想要訂購返回的列表(在另一個評論中說您的類型爲EntityCollection<CourseStudent>) - 您無需將其轉換爲ArrayList,只需直接使用該值即可。

您可以使用OrderBy LINQ擴展方法(以及您使用的變量類型 - IList也不合適)。

這會工作爲您的需求(其中CourseStudentPropertyCourseStudent屬性):

var alls = RetrieveCourseStudents(cf); 
var orderedAlls = alls.OrderBy(cs => cs.CourseStudentProperty); 
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; 
    } 

} 
} 
+0

感謝您發佈一個答案!雖然代碼片段可以回答這個問題,但添加一些附加信息仍然很棒,比如解釋等。 – j0k 2012-10-04 16:14:50

0

只是用這個簡單的代碼:)

(From x In list).ToArray 
0

你可以使用LINQ聯盟延期。

請注意,您可以將任何類型的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