c# - .Cast 优于 .Select 有什么好处?

标签 c# linq

我有一个带有隐式转换运算符到大多数基本类型的类型,并尝试使用 .Cast<string>()在这种类型的集合上,失败了。当我深入研究它时,我注意到通过 as 类型转换不使用隐式或显式转换,只是不会编译,所以我想这就是 .Cast 的地方摔倒。所以这失败了

var enumerable = source.Cast<string>();

但这行得通

var enumerable = source.Select(x => (string)x);

那么 Cast 有什么好处呢?当然,它短了几个字符,但似乎更受限制。如果可以用来转换,除了语法更紧凑之外还有什么好处吗?

最佳答案

转换用法

Cast的好处|当您的收藏仅实现 IEnumerable 时出现(即不是通用版本)。在这种情况下,Cast将所有元素转换为 TResult通过类型转换,并返回IEnumerable<TResult> .这很方便,因为所有其他 LINQ 扩展方法(包括 Select )仅针对 IEnumerable<T> 声明.在代码中,它看起来像这样:

IEnumerable source = // getting IEnumerable from somewhere

// Compile error, because Select is not defined for IEnumerable.
var results = source.Select(x => ((string)x).ToLower());

// This works, because Cast returns IEnumerable<string>
var results = source.Cast<string>().Select(x => x.ToLower());

CastOfType是为 IEnumerable 定义的仅有的两个 LINQ 扩展方法. OfTypeCast一样工作, 但跳过不属于 TResult 类型的元素而不是抛出异常。

强制转换和隐式转换

当您使用 Cast 时,您的隐式转换运算符 不起作用的原因很简单:Cast Actor objectTResult - 并且您的转换未针对 object 定义,仅适用于您的特定类型。 Cast 的实现是这样的:

foreach (object obj in source)
    yield return (TResult) obj;

执行转换的这种“失败”对应于基本转换规则 - 如本例所示:

YourType x = new YourType(); // assume YourType defines an implicit conversion to string
object   o = x;

string bar = (string)x;      // Works, the implicit operator is hit.
string foo = (string)o;      // Fails, no implicit conversion between object and string

关于c# - .Cast 优于 .Select 有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7132500/

相关文章:

c# - 带文字的半透明圆形控件

c# - 列出日期,添加时间以列出 linq

c# - 为什么 C# 的重载解析在 Func<T,T> 和 Action<T> 之间不起作用?

c# - 单元测试表达式树

c# - LINQ to XML 中没有结果

c# - LINQ:按聚合分组但仍然从最近的行中获取信息?

c# - 将 Roslyn 与 Nuget 结合使用时避免大量的包和二进制文件

c# - 我们可以使用 LINQ 扩展方法 SequenceEqual 使用 IEqualityComparer 接口(interface)逐字段比较两个复杂集合吗

c# - 当 exe 位于网络上时,我的 C#.NET 应用程序运行速度较慢

c# - linq上的简单查询