2012-01-07 24 views
4

IListArrayListにキャストできますか?IlistをArrayListにキャストする方法

はい場合はどうすればよいですか?

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

これは間違いありませんか?

さは、エラーが発生しました:

コメントで示唆したように

Unable to cast object of type

+7

'どのような型を返すRetrieveCourseStudents'ん?なぜそれを 'ArrayList'にキャストする必要がありますか?新しいコードではなく、ジェネリックコレクションで 'ArrayList'を使うべきです。 – Oded

+0

パブリックEntityCollection RetrieveCourseStudents(CF cf); –

+0

なぜそれを 'ArrayList'にキャストしたいのですか? – Oded

答えて

0

これは、すべての多型についてです。 ArrayListは、インターフェイスIListの実装です。

IList iList = new ArrayList(); 

変数はiListから静的な型がIListのですが、それはArrayListオブジェクトを参照します!

インターフェイスまたは抽象クラスからオブジェクトをインスタンス化/作成できないため、IListからArrayListへの実際のキャストはありません。

4

、あなたの代わりに

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

Tanx非常に.... –

4

あなたはそれだけであれば、すでにArrayListallsをキャストすることができるだろうジェネリックコレクションを使用することを検討すべきですArrayListです。すなわち、RetrieveCourseStudentsによって返されたオブジェクトがArrayListである場合です。

それはあなたが新しいオブジェクトを作成する必要があり、その後でない場合は、luckly ArrayListはこれを行うことができますconstructorがあります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も適切ではありません)。

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

0

はちょうどあなたがLINQ連合使用することができ、この単純なコード:)

(From x In list).ToArray 
0

を使用します(CourseStudentPropertyCourseStudentのプロパティです)

これは、ニーズのために働くでしょう拡張。

IEnumerableの任意の型をこの手法(配列、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 
関連する問題