在我的项目中,我有一个实现IMyClass的MyClass.我需要通过转换其他项目的列表来返回IMyClass列表.为了简单起见,假设我可以通过将另一个项目传递到其构造函数(即新的MyClass(item))中来创建MyClass.
考虑以下两行(据我所知)产生相同的结果:
var option1 = items.Select(item => new MyClass(item)).Cast<IMyClass>().ToList() var option2 = items.Select(item => new MyClass(item) as IMyClass).ToList()
在我看来,#1选项将需要一个双重枚举,一次将所有项目投射到我的界面,一次产生列表.如果我是对的,那么选项#2会更聪明.然而,我从来没有看到任何代码使用的选项#2,而且我倾向于假设我不够聪明地提出一些聪明的东西,其余的C#社区没有.
在旁注中,我认为选项2更美观,但这只是我.
我的问题是:是我的选择#2一个更好的想法,我认为是?有没有什么问题我失踪或其他原因我想要坚持选项#1?或者我可能比较两个愚蠢的想法,当有一个更智能的第三个,我完全失踪?
解决方法
我会去选择3:
var option3 = items.Select<Foo,IMyClass>(item => new MyClass(item)) .ToList()
或者,不要使用,只能正常投掷:
var option4 = items.Select(item => (IMyClass) new MyClass(item)) .ToList()
这两个都比使用Cast更清晰.
呵呵,和.NET 4(由于协方差)的C#4,你可以在ToList调用中放一个类型参数:
var option5 = items.Select(item => new MyClass(item)) .ToList<IMyClass>()