2015-09-22 140 views
3

如何将int array转换为nullable int array而不循环播放元素?如何将int数组转换为nullable int数组而不循环元素?

project.Suppliers = project.ProjectSuppliers.Select(proj => proj.ProjectSupplier).ToArray(); 
在上面的代码

我想分配给project.ProjectSuppliers.Select(proj => proj.ProjectSupplier).ToArray();可空数组project.Suppliers但我不能,因为它可以为空那么什么是这样做没有遍历一个元素的最佳途径之一。

+0

目的是什么,它们都不会为空。然后,供应商模型似乎又不一致。它应该是supplierid的?为什么在那里看起来很奇怪。 – Wouter

+0

该项目可能没有任何供应商。 – user3260672

+0

在这种情况下,数组为空或空,但元素仍然是int的 – Wouter

回答

8

两个选项:

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

使用Cast<>()

演员在SELECT语句中的项

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

使用LINQ to对象时,第一个选项将可能有表现略好,它可能会有更少的惊喜。 (有些类型重载运营商在代码中显式转换,但Cast<>()会抛出异常的相同的转换,因为它的内部代码不知道这些类型是在编译时。)

第二种选择是更简洁时你有一个预编码的IEnumerable<>IQueryable<>,你不想为此目的创建一个完整的Select()声明。

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

+1

这是一个很好的答案,非常感谢 – user3260672