我有一个类型对象的集合,我知道它们是类型Employee.我想对员工执行一些linq操作,使用类似这样的东西:
var options = (from e in m_Employees
select (e as Employee).DepartmentCode).Distinct();
Run Code Online (Sandbox Code Playgroud)
但是,作为员工并不奇怪地给出错误.有办法吗?
改变集合并不是一个真正的选择,因为我维护代码并且我想避免重大变化.
你可以使用其中之一
from e in m_Employees.Cast<Employee>()
select e.DepartmentCode
Run Code Online (Sandbox Code Playgroud)
要么
from e in m_Employees.OfType<Employee>()
select e.DepartmentCode
Run Code Online (Sandbox Code Playgroud)
Cast如果您不能将每个项目强制转换,则会产生错误Employee,但OfType会过滤掉与该类型不匹配的对象.
而不是使用as Employee它最好使编译器基本上插入Cast<T>使用显式类型范围变量的调用:
var options = (from Employee e in m_Employees
select e.DepartmentCode).Distinct();
Run Code Online (Sandbox Code Playgroud)
或者等价地:
var options = m_Employees.Cast<Employee>()
.Select(e => e.DepartmentCode)
.Disinct();
Run Code Online (Sandbox Code Playgroud)
不过,我仍然没有想到你原来的代码失败,如果阵列真的不只是包括Employee引用...如果你得到一个NullReferenceException那么无论是值的一个为空,或者它是一个非空参照非Employee对象.这些都会给你一个上述代码的错误,但你将能够根据你是否仍然得到一个NullReferenceException或一个来看到哪一个InvalidCastException.
通常,您只应as在有条件地使用结果时使用.如果你确定每个值都是正确的类型,你应该使用强制转换 - 这样如果你错了,你会得到一个异常的代码而不是传播一个空引用到其余的代码,它可能会在以后造成伤害,并使得很难发现错误的来源.
如果您遇到编译时错误,那么根据您看到的异常情况,可能会有多种原因.
编辑:好的,所以这是一个IEnumerable导致编译时错误...... Cast<T>()并且OfType<T>()只是on IEnumerable而不是on的扩展方法IEnumerable<T>.
| 归档时间: |
|
| 查看次数: |
7028 次 |
| 最近记录: |