首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从List<X>到List<Y>转换的更短的语法?

从List<X>到List<Y>转换的更短的语法?
EN

Stack Overflow用户
提问于 2011-02-25 16:51:25
回答 5查看 195.1K关注 0票数 266

我知道可以将一组项从一种类型转换为另一种类型(假设您的对象有一个公共的静态显式运算符方法来进行转换),如下所示:

代码语言:javascript
复制
List<Y> ListOfY = new List<Y>();

foreach(X x in ListOfX)
    ListOfY.Add((Y)x);

但是,难道不能一次转换整个列表吗?例如,

代码语言:javascript
复制
ListOfY = (List<Y>)ListOfX;
EN

回答 5

Stack Overflow用户

发布于 2011-02-25 16:54:17

直接转换var ListOfY = (List<Y>)ListOfX是不可能的,因为它需要List<T>类型的co/contravariance,而这并不是在所有情况下都能保证的。请继续阅读,查看此造型问题的解决方案。

虽然能够像这样编写代码看起来很正常:

代码语言:javascript
复制
List<Animal> animals = (List<Animal>) mammalList;

因为我们可以保证每个哺乳动物都是动物,这显然是一个错误:

代码语言:javascript
复制
List<Mammal> mammals = (List<Mammal>) animalList;

因为不是每种动物都是哺乳动物。

但是,使用C# 3和更高版本,您可以使用

代码语言:javascript
复制
IEnumerable<Animal> animals = mammalList.Cast<Animal>();

这让选角变得简单了一点。这在语法上等同于逐个添加代码,因为它使用显式强制转换将列表中的每个Mammal转换为Animal,如果转换不成功,则将失败。

如果您希望更好地控制转换/转换过程,可以使用List<T>类的ConvertAll方法,该方法可以使用提供的表达式来转换项。它有一个额外的好处,那就是它返回一个List,而不是IEnumerable,所以不需要.ToList()

代码语言:javascript
复制
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
票数 107
EN

Stack Overflow用户

发布于 2011-02-25 16:56:09

您可以使用List<Y>.ConvertAll<T>([Converter from Y to T]);

票数 8
EN

Stack Overflow用户

发布于 2018-11-15 02:12:24

这不完全是这个问题的答案,但它可能对一些人有用:正如@SWeko所说,由于协方差和逆方差,List<X>不能在List<Y>中转换,但List<X>可以转换为IEnumerable<Y>,甚至可以使用隐式转换。

示例:

代码语言:javascript
复制
List<Y> ListOfY = new List<Y>();
List<X> ListOfX = (List<X>)ListOfY; // Compile error

代码语言:javascript
复制
List<Y> ListOfY = new List<Y>();
IEnumerable<X> EnumerableOfX = ListOfY;  // No issue

最大的优点是它不会在内存中创建新的列表。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5115275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档