2012-01-07 3 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

+0

public 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

Вы бы только быть в состоянии бросить alls к ArrayList, если он уже является ArrayList, т.е. если объект, возвращенный RetrieveCourseStudents, является ArrayList.

Если это не так, то вам нужно создать новый объект, воистину счастлив ArrayList имеет constructor, который может это сделать: new ArrayList(RetrieveCourseStudents(cf))


Стоит отметить, что вы должны использовать дженерики (например, List<T>) вместо ArrayList, поэтому, если вам не нужно взаимодействовать с каким-то старым кодом, который не может быть обновлен, я бы держался подальше от него.

0

Да, Мы можем использовать IList для ArrayList, только если RetrieveCourseStudents (cf) возвращает тип 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, но просто используйте это значение напрямую.

Вы можете использовать метод расширения LINQ OrderBy (и тип переменной, который вы используете, - IList также не подходит).

Это будет работать для ваших нужд (где CourseStudentProperty является свойством CourseStudent):

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

просто использовать этот простой код :)

(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 
Смежные вопросы