Литые вложенный список, вложенный список


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

Уже опробованные решения:

List<List<String>> new_list = new List<List<string>>(abc.Cast<List<String>>());

И

List<List<String>> new_list = abc.Cast<List<String>>().ToList();

Оба из которых дают следующую ошибку:

Невозможно привести объект типа - Система.Коллекции.Родовой.Список 1[System.Int32]' to type 'System.Collections.Generic.List1 [Система.Строка]'.

1 4

1 ответ:

Вместо этого можно использовать Select():

List<List<String>> new_list = abc.Select(x => x.Select(y=> y.ToString()).ToList()).ToList();

причина этого исключения: Cast бросит InvalidCastException, потому что он пытается преобразовать List<int> в object, а затем бросит его в List<string>:

List<int> myListInt = new List<int> { 5,4};
object myObject = myListInt;
List<string> myListString = (List<string>)myObject; // Exception will be thrown here
Итак, это невозможно. Даже, вы не можете бросить int в string также.
int myInt = 11;
object myObject = myInt;
string myString = (string)myObject; // Exception will be thrown here

Причина этого исключения состоит в том, что коробочное значение может быть распакован только в переменную точно так же Тип.


Дополнительная Информация:

Здесь имплеметация Cast<TResult>(this IEnumerable source) метод, если вам интересно:

public static IEnumerable<TResult> Cast<TResult>(this IEnumerable source) {
    IEnumerable<TResult> typedSource = source as IEnumerable<TResult>;
    if (typedSource != null) return typedSource;
    if (source == null) throw Error.ArgumentNull("source");
    return CastIterator<TResult>(source);
}

Как вы видите, он возвращает CastIterator:

static IEnumerable<TResult> CastIterator<TResult>(IEnumerable source) {
    foreach (object obj in source) yield return (TResult)obj;
}

Посмотрите на приведенный выше код. Он будет перебирать исходный код с циклом foreach и преобразует все элементы в object, а затем в (TResult).