在我的项目中,我有一个 MyClass
实现了 IMyClass
。我需要通过转换其他项目的列表来返回 IMyClass
的列表。为简单起见,假设我可以创建一个 MyClass
,只需将另一个项目传递给它的构造函数,即 new MyClass(item)
。
考虑以下两行,它们(据我所知)产生相同的结果:
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()
或者,不要使用 as
而只是正常转换:
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>()
关于c# - 我应该转换我的 lambda 还是转换 IEnumerable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15163254/