如何在不遍历元素的情况下将 int 数组转换为可为 null 的 int 数组?

how to convert int array to nullable int array without looping over the elements?

如何在不遍历元素的情况下将 int array 转换为 nullable int array

project.Suppliers = project.ProjectSuppliers.Select(proj => proj.ProjectSupplier).ToArray();

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

两个选项:

在你的Select声明中施展项目:

project.Suppliers = project.ProjectSuppliers
    .Select(proj => (int?)proj.ProjectSupplier)
    .ToArray();

使用Cast<>():

project.Suppliers = project.ProjectSuppliers
    .Select(proj => proj.ProjectSupplier)
    .Cast<int?>()
    .ToArray();

当使用 LINQ to Objects 时,第一个选项的性能可能会稍好一些,而且它的意外情况可能会更少。 (某些类型在代码中使用重载运算符进行显式转换,但 Cast<>() 会为相同的转换抛出异常,因为其内部代码在编译时不知道这些类型是什么。)

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

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