Литые вложенный список, вложенный список
Я знаю, что можно привести список элементов из одного типа в другой, но как вы приведете вложенный список к вложенному списку .
Уже опробованные решения:
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.List
1 [Система.Строка]'.
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)
.