c# - 我应该转换我的 lambda 还是转换 IEnumerable?

标签 c# linq casting

在我的项目中,我有一个 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/

相关文章:

java - 为什么数字会自动转换为双倍?

androidx Activity 无法转换为 AccountAuthenticatorActivity

java - 方法泛型返回java类

c# - mono(c#) 检测用户是否在同一网络上

c# - 如何获得表达结果?

c# - 无法在 NuGet 包上找到 Microsoft.Azure.Services.AppAuthentication

c# - 通过 LINQ 将函数应用于集合的所有元素

.net - 在 LINQ 中如何找到连接 2 个表的不同项目?

c# - 如何在 iOS 上的 Google Play 游戏服务中禁用推送通知权限?

linq - 使用 LINQ 动态排序