Casting populated List <BaseClass> в список <ChildClass>

У меня есть List<BaseClass> с членами в нем. Я хотел бы передать список (и все его члены) в тип List<ChildClass>, где ChildClass наследует BaseClass. Я знаю, что могу получить тот же результат через foreach:

List<ChildClass> ChildClassList = new List<ChildClass>();
foreach( var item in BaseClassList )
{
    ChildClassList.Add( item as ChildClass );
}

Но есть ли более простой способ сделать это? Примечание - это делается на платформе WP7.

Ответ 1

Вы можете сделать это, если действительно уверены, что все элементы являются доступными:

ChildClassList = BaseClassList.Cast<ChildClass>().ToList();

Ваш текущий код добавляет null, если элемент BaseClass не может быть добавлен в ChildClass. Если это действительно было вашим намерением, это было бы эквивалентно:

ChildClassList = BaseClassList.Select(x => x as ChildClass).ToList();

Но я бы предпочел это, включая проверку типов, и пропустил элементы, которые не совпадают:

ChildClassList = BaseClassList.OfType<ChildClass>().ToList();

Ответ 2

Следующее почти эквивалентно вашему текущему коду (единственная недостающая вещь заключается в том, что он не добавляет нули для неудачных попыток):

var childList = baseList.OfType<ChildClass>().ToList();

Это игнорирует экземпляры, в которых список содержит другой производный класс, отличный от ChildClass.

Вы также можете использовать:

var childList = baseList.Cast<ChildClass>().ToList();

Но это вызовет InvalidCastException для вещей, которые он не может отличить.