我知道可以将一组项从一种类型转换为另一种类型(假设您的对象有一个公共的静态显式运算符方法来进行转换),如下所示:
List<Y> ListOfY = new List<Y>();
foreach(X x in ListOfX)
ListOfY.Add((Y)x);
但是,难道不能一次转换整个列表吗?例如,
ListOfY = (List<Y>)ListOfX;
发布于 2011-02-25 16:54:17
直接转换var ListOfY = (List<Y>)ListOfX
是不可能的,因为它需要List<T>
类型的co/contravariance,而这并不是在所有情况下都能保证的。请继续阅读,查看此造型问题的解决方案。
虽然能够像这样编写代码看起来很正常:
List<Animal> animals = (List<Animal>) mammalList;
因为我们可以保证每个哺乳动物都是动物,这显然是一个错误:
List<Mammal> mammals = (List<Mammal>) animalList;
因为不是每种动物都是哺乳动物。
但是,使用C# 3和更高版本,您可以使用
IEnumerable<Animal> animals = mammalList.Cast<Animal>();
这让选角变得简单了一点。这在语法上等同于逐个添加代码,因为它使用显式强制转换将列表中的每个Mammal
转换为Animal
,如果转换不成功,则将失败。
如果您希望更好地控制转换/转换过程,可以使用List<T>
类的ConvertAll
方法,该方法可以使用提供的表达式来转换项。它有一个额外的好处,那就是它返回一个List
,而不是IEnumerable
,所以不需要.ToList()
。
List<object> o = new List<object>();
o.Add("one");
o.Add("two");
o.Add(3);
IEnumerable<string> s1 = o.Cast<string>(); //fails on the 3rd item
List<string> s2 = o.ConvertAll(x => x.ToString()); //succeeds
发布于 2011-02-25 16:56:09
您可以使用List<Y>.ConvertAll<T>([Converter from Y to T]);
发布于 2018-11-15 02:12:24
这不完全是这个问题的答案,但它可能对一些人有用:正如@SWeko所说,由于协方差和逆方差,List<X>
不能在List<Y>
中转换,但List<X>
可以转换为IEnumerable<Y>
,甚至可以使用隐式转换。
示例:
List<Y> ListOfY = new List<Y>();
List<X> ListOfX = (List<X>)ListOfY; // Compile error
但
List<Y> ListOfY = new List<Y>();
IEnumerable<X> EnumerableOfX = ListOfY; // No issue
最大的优点是它不会在内存中创建新的列表。
https://stackoverflow.com/questions/5115275
复制相似问题