如何将int数组转换为nullable int数组而不循环遍历元素?

use*_*672 3 c# arrays nullable

如何转换int arraynullable int array没有循环元素?

project.Suppliers = project.ProjectSuppliers.Select(proj => proj.ProjectSupplier).ToArray();
Run Code Online (Sandbox Code Playgroud)

在上面的代码我试图分配project.ProjectSuppliers.Select(proj => proj.ProjectSupplier).ToArray();给可空数组,project.Suppliers但我不能,因为它是可空的,所以最好的方法是什么,而不是逐个循环元素.

Str*_*ior 9

两种选择:

在Select语句中转换项目:

project.Suppliers = project.ProjectSuppliers
    .Select(proj => (int?)proj.ProjectSupplier)
    .ToArray();
Run Code Online (Sandbox Code Playgroud)

用途Cast<>():

project.Suppliers = project.ProjectSuppliers
    .Select(proj => proj.ProjectSupplier)
    .Cast<int?>()
    .ToArray();
Run Code Online (Sandbox Code Playgroud)

使用LINQ to Objects时,第一个选项的性能可能稍好一些,并且可能会有更少的惊喜.(某些类型在代码中使用重载运算符进行显式转换,但Cast<>()会为同一转换引发异常,因为它的内部代码在编译时不知道这些类型是什么.)

当你有一个预组合IEnumerable<>或者IQueryable<>你不想Select()为此目的创建一个完整的语句时,第二个选项更简洁.

我还应该注意,当你使用LINQ to Objects时,这两个都会迭代给定的集合.您无法在C#中将一种类型的数组转换为另一种类型的数组,因为在运行时,每个数组实例都知道它所持有的对象类型以及每个对象需要多少空间.这些方法只是为您提供了一个很好的可链接语法,而不是需要一个for循环.