C# 对对象数组执行linq查询?
我有一个类型对象的集合,我知道它们是Employee类型。我想使用员工对其执行一些linq操作,类似于:C# 对对象数组执行linq查询?,c#,linq,C#,Linq,我有一个类型对象的集合,我知道它们是Employee类型。我想使用员工对其执行一些linq操作,类似于: var options = (from e in m_Employees select (e as Employee).DepartmentCode).Distinct(); 但as员工给出错误并不奇怪。有办法绕过它吗 更改集合并不是一个真正的选项,因为我正在维护代码,我希望避免大的更改 一个选项是: (from e in m_Employ
var options = (from e in m_Employees
select (e as Employee).DepartmentCode).Distinct();
但as员工给出错误并不奇怪。有办法绕过它吗
更改集合并不是一个真正的选项,因为我正在维护代码,我希望避免大的更改 一个选项是:
(from e in m_Employees
let x = e as Employee
select x.DepartmentCode).Distinct();
使用以下命令:
var options = (from e in m_Employees.Cast<Employee>()
select e.DepartmentCode).Distinct();
var options=(来自m_Employees.Cast()中的e)
选择e.DepartmentCode).Distinct();
重要的部分是演员阵容
。我的回答假设m_Employees
是IEnumerable
类似ArrayList
而不是IEnumerable
类似列表,您可以使用
from e in m_Employees.Cast<Employee>()
select e.DepartmentCode
来自e in m_Employees.Cast()的
选择e.部门代码
或
来自m_Employees.of type()中的e
选择e.部门代码
Cast
如果您不能将每个项强制转换为Employee
,则会出现错误,但类型为的会过滤掉与类型不匹配的对象。与其将用作Employee
不如让编译器基本上使用显式类型的范围变量插入对Cast
的调用:
var options = (from Employee e in m_Employees
select e.DepartmentCode).Distinct();
或者,替代地和等效地:
var options = m_Employees.Cast<Employee>()
.Select(e => e.DepartmentCode)
.Disinct();
var options=m_Employees.Cast()
.选择(e=>e.部门代码)
.disect();
然而,如果数组真的只包含Employee
references,我仍然不会期望您的原始代码失败。。。如果您得到的是NullReferenceException
,则其中一个值为null,或者它是对非Employee对象的非null引用。这两个选项仍然会给您上述代码带来错误,但您可以根据是否仍然获得NullReferenceException
或InvalidCastException
来查看哪一个
一般来说,在有条件地使用结果时,只应将用作
。如果您确定每个值都是正确的类型,那么您应该使用强制转换,这样,如果您错了,代码就会出现异常,而不是将空引用传播到代码的其余部分,这样以后可能会造成伤害,并且很难发现错误的源
如果您遇到编译时错误,那么根据您看到的异常情况,可能有许多原因
编辑:好的,这是一个导致编译时错误的IEnumerable
Cast()
和of type()
都是在IEnumerable
上而不是在IEnumerable
上的扩展方法。您可以尝试以下方法:
var options = m_Employees
.Cast<Employee>()
.Select(item => item.DepartmentCode)
.Distinct();
var options=m_员工
.Cast()
.选择(项目=>item.DepartmentCode)
.Distinct();
什么错误?运行时还是编译时?请注意,在查询表达式中表达对Cast
调用的一种更简洁的方法是显式指定范围变量的类型。您认为他的代码为什么会起作用?正如我在回答中指出的那样,他“铸造”的原因似乎是他正在使用非类型化的数据源(IEnumerable
)。在这种情况下,他的代码就是非法的。@Daniel:我认为“似乎是”是言过其实了。它很可能是一个object[]
或类似的东西(object[]
根据问题的标题,听起来很有可能)。但是是的,如果它是一个非类型的集合,那就可以解释它了。基本上我们不知道…这是一个非类型化的集合,我得到的错误是参数类型'string'不能分配给参数类型'TResult',但这两个答案都解决了这个问题。Thanks@Marcom:那么,以后请告诉我们错误是什么,而不是让我们猜测。
var options = m_Employees
.Cast<Employee>()
.Select(item => item.DepartmentCode)
.Distinct();