将嵌套列表<X> 转换为嵌套列表<Y>
Cast Nested List<X> to Nested List<Y>
我知道可以将项目列表从一种类型转换为另一种类型,但是如何将嵌套列表转换为嵌套列表。
已经尝试过的解决方案:
List<List<String>> new_list = new List<List<string>>(abc.Cast<List<String>>());
和
List<List<String>> new_list = abc.Cast<List<String>>().ToList();
两者都给出以下错误:
Unable to cast object of type
'System.Collections.Generic.List1[System.Int32]' to type
'System.Collections.Generic.List
1[System.String]'.
您可以使用 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
此异常的原因是,装箱值只能拆箱到[的变量=43=]完全相同的类型。
附加信息:
这里是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);
}
如你所见,returns CastIterator
:
static IEnumerable<TResult> CastIterator<TResult>(IEnumerable source) {
foreach (object obj in source) yield return (TResult)obj;
}
看上面的代码。它将使用 foreach
循环遍历源,并将所有项目转换为 object
,然后转换为 (TResult)
.
我知道可以将项目列表从一种类型转换为另一种类型,但是如何将嵌套列表转换为嵌套列表。
已经尝试过的解决方案:
List<List<String>> new_list = new List<List<string>>(abc.Cast<List<String>>());
和
List<List<String>> new_list = abc.Cast<List<String>>().ToList();
两者都给出以下错误:
Unable to cast object of type 'System.Collections.Generic.List
1[System.Int32]' to type 'System.Collections.Generic.List
1[System.String]'.
您可以使用 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
此异常的原因是,装箱值只能拆箱到[的变量=43=]完全相同的类型。
附加信息:
这里是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);
}
如你所见,returns CastIterator
:
static IEnumerable<TResult> CastIterator<TResult>(IEnumerable source) {
foreach (object obj in source) yield return (TResult)obj;
}
看上面的代码。它将使用 foreach
循环遍历源,并将所有项目转换为 object
,然后转换为 (TResult)
.