2011-03-11 4 views
2

필자는 직원 유형을 알고있는 유형 객체 컬렉션을 보유하고 있습니다. 나는 직원이와 유사한 어떤 것을 사용하여 일부 LINQ 작업을 수행 할 수 싶습니다개체 배열에 대해 linq 쿼리를 수행 하시겠습니까?

var options = (from e in m_Employees 
         select (e as Employee).DepartmentCode).Distinct(); 

그러나 직원과 놀라 울 정도로 오류가 제공되지 않습니다. 주위에 방법이 있습니까?

코드를 유지 관리하고 큰 변화를 피하기 위해 컬렉션을 변경하는 것은 실제로 옵션이 아닙니다.

+1

어떤 오류를? 런타임 또는 컴파일 시간? –

답변

9

당신은 당신이 Employee에 각 항목을 캐스팅 할 수없는 경우 중 하나

from e in m_Employees.Cast<Employee>() 
    select e.DepartmentCode 

또는

from e in m_Employees.OfType<Employee>() 
    select e.DepartmentCode 

Cast

오류를 슬로우하는 사용할 수 있지만 OfType는 유형을 일치하지 않는 이러한 개체를 필터링합니다.

+0

쿼리 표현식에서 '캐스트 '에 대한 호출을 표현하는 더 좋은 방법은 명시 적으로 범위 변수의 유형을 지정하는 것입니다. –

0

하나의 옵션은 다음과 같습니다

(from e in m_Employees 
let x = e as Employee 
select x.DepartmentCode).Distinct(); 
0

사용이 :

var options = (from e in m_Employees.Cast<Employee>() 
       select e.DepartmentCode).Distinct(); 

중요한 부분은 Cast<Employee>입니다. 내 대답은 m_EmployeesList<Employee>과 같은 IEnumerable<Employee> 대신 ArrayList과 같은 IEnumerable 인 것으로 가정합니다.

6

오히려 명시 적으로 입력 범위 변수 사용 Cast<T>에 컴파일러는 기본적으로 전화를 삽입하기 위해 더 좋을 것이다 as Employee를 사용하는 것보다 :

var options = (from Employee e in m_Employees 
       select e.DepartmentCode).Distinct(); 

또는 대안과 동등하게 그러나

var options = m_Employees.Cast<Employee>() 
         .Select(e => e.DepartmentCode) 
         .Disinct(); 

을, 어레이가 실제로 일 경우에만 Employee 참조 만 포함하면 원래 코드가 실패 할 것으로 기대하지 않았을 것입니다. a NullReferenceException 다음 중 하나의 값이 null 인 경우, 또는입니다. 이는 비 Employee 오브젝트에 대한 널이 아닌 참조였습니다. 이것들은 여전히 ​​위의 코드에서 둘 다 오류를 발생 시키지만, 여전히 NullReferenceException 또는 InvalidCastException 중 어떤 것이 있는지 여부에 따라 어느 것을 볼 수 있습니다.

조건부로 결과를 사용할 때는 일반적으로 as 만 사용해야합니다. 인 경우 모든 값은 실제로 올바른 유형입니다. 대신 캐스트를 사용해야합니다. 잘못하면 null 참조를 전파하는 대신 예외가 발생합니다. 코드의 나머지 부분은 나중에 해를 입히고 오류의 원인을 찾기 어렵게 만듭니다.

컴파일 타임 오류가 발생하면 어떤 예외가 있었는지에 따라 여러 가지 원인이있을 수 있습니다.

편집 : 좋아, 그래서 IEnumerable 컴파일 시간 오류가 발생했습니다 ...Cast<T>()OfType<T>()IEnumerable<T> 대신에 단지 IEnumerable에있는 확장 방법입니다.

+0

왜 코드가 효과가 있어야한다고 생각하십니까? 그가 "캐스팅"하는 이유는 그가 내 대답에서 지적한대로 유형이 지정되지 않은 데이터 소스 ('IEnumerable')를 사용하고있는 것 같습니다. 이 경우 그의 코드는 불법입니다. –

+0

@ 대니얼 : 나는 "있는 것 같다"는 것은 과장이라고 생각합니다. 그것은'object [] '또는 유사한 것일 수도 있습니다 ('object []'는 질문 제목에 기초 할 가능성이 높습니다). 그러나 그렇습니다. 설명 할 수없는 유형이없는 콜렉션이라면 그렇습니다. 기본적으로 우리는 모르겠다 ... –

+0

그것은 타입이 지정되지 않은 콜렉션이며, 인수 유형 '문자열'이 'TResult'매개 변수 유형에 지정할 수 없다. 그러나 두 가지 대답으로 문제가 해결되었다. 감사합니다. – Marcom

0

이 작업을 시도 할 수 :

var options = m_Employees 
     .Cast<Employee>() 
     .Select(item => item.DepartmentCode) 
     .Distinct(); 
관련 문제