C# 对对象数组执行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

我有一个类型对象的集合,我知道它们是Employee类型。我想使用员工对其执行一些linq操作,类似于:

 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();