gpt4 book ai didi

c# - 直接转换数组和使用 System.Linq.Cast 有什么区别?

转载 作者:行者123 更新时间:2023-12-04 16:37:27 24 4
gpt4 key购买 nike

假设我有 2 个类,AB , 和 B可以转换为 A .我声明了一个 B[] 类型的数组称为 b .那么如果我想投bA[](A[])b 之间有什么区别?和 b.Cast<A>()

最佳答案

这是两个不同的东西。

语言转换

(A[])bb输入 A[]如果 b,则不会在运行时编译或抛出异常不是 A[] 的类型.

以 double 和整数为例:

var array = new object[2];

array[0] = 10.2;
array[1] = 20.8;

var casted = (int[])array; // does not compile here,
// or throw an exception at runtime if types mismatch

这里我们只是将一种类型转换为另一种类型,不管它们是什么,集合与否。

Casting and type conversions (C# Programming Guide)

Linq 转换

Cast<TResult>转换 IEnumerable 的每一项至 TResult .

它只是一个已经编写好的 LINQ 循环,目的是让我们在 boxed 值上的生活更轻松。

Enumerable.Cast(IEnumerable) Method

Casts the elements of an IEnumerable to the specified type.

来自 source code

static IEnumerable<TResult> CastIterator<TResult>(IEnumerable source)
{
foreach (object obj in source) yield return (TResult)obj;
}

因此,此方法可用于从 Rows 等集合中拆箱装箱的值的 DataGridView或任何类似的“简化”集合,例如 ItemsListBoxComboBox .

这意味着项目的类型必须是 TResult 的类型或祖先。

例子

var array = new object[2];

array[0] = 10.2;
array[1] = 20.8;

var converted = array.Cast<int>(); // compiles but will not work
// and throw an InvalidCastException

注意

由于屈服,Cast方法是延迟的,所以我们只有在执行时才能得到结果,例如使用 foreachToList .

Deferred Execution of LINQ Query

Deferred Vs Immediate Query Execution in LINQ

Deferred execution and lazy evaluation

解决样本问题的替代方法

因此要转换数组,我们可以使用直接转换,例如使用 foreachSelect :

var converted = array.Select(v => (int)v).ToArray(); // get int[]

Console.WriteLine(string.Join(Environment.NewLine, converted));

> 10
> 20

使用扩展方法

static public class EnumerableHelper
{
static public IEnumerable<TResult> Cast<TSource, TResult>(this IEnumerable<TSource> source)
where TSource : IConvertible
{
foreach ( TSource obj in source )
yield return (TResult)Convert.ChangeType(obj, typeof(TResult));
}
}

var converted = array.Cast<double, int>();

> 10
> 21

还有 CultureInfo.InvariantCulture以避免数字问题,以及避免四舍五入的格式化程序。

关于c# - 直接转换数组和使用 System.Linq.Cast 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67954096/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com