Как привести Ilist к ArrayList? - PullRequest
4 голосов
/ 07 января 2012

Можно ли разыграть IList в ArrayList?

если да, что мне делать?

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

Это правильно?

имеет ошибку:

Невозможно привести объект типа

Ответы [ 8 ]

4 голосов
/ 07 января 2012

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

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


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

4 голосов
/ 07 января 2012

Как предлагается в комментариях, вы должны рассмотреть возможность использования родовых коллекций вместо

List<Student> students = RetrieveCourseStudents(cf).Cast<Student>().ToList() 
0 голосов
/ 30 апреля 2014

Вы можете использовать расширение 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
0 голосов
/ 07 октября 2013

просто используйте этот простой код:)

(From x In list).ToArray
0 голосов
/ 13 августа 2012
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 голосов
/ 07 января 2012

Поскольку вы прокомментировали, что просто хотите упорядочить возвращенный список (который, как вы говорите, в другом комментарии имеет тип EntityCollection<CourseStudent>) - вам не нужно приводить к ArrayList, а просто использовать значение напрямую.

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

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

var alls = RetrieveCourseStudents(cf);
var orderedAlls = alls.OrderBy(cs => cs.CourseStudentProperty);
0 голосов
/ 07 января 2012

Это все о полиморфизме. ArrayList является реализацией интерфейса IList .

 IList iList = new ArrayList();  

Статический тип из переменной iList: IList , но он ссылается на объект ArrayList!

Нет реального приведения из IList в ArrayList, потому что вы не можете создать экземпляр / создать объект из интерфейса или абстрактного класса.

0 голосов
/ 07 января 2012

Да, мы можем привести 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();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...