2011-10-03 4 views
0

나는이 문제를 해결하기 위해 노력하고있는 실제 문제를 쉽게 소화 한 버전이기 때문에이 예제를 고안해 냈습니다. 다음은 클래스와 그 관계입니다.LINQ ToArray는이 예제에서 강력한 형식의 배열을 반환 할 수 있습니까?

먼저 문자열로 색인화 된 상태 개체 사전 (예 : 이름 또는 약어)이 포함 된 국가 클래스가 있습니다. 국가 클래스의 내용은 무관 :

class Country 
{ 
    Dictionary<string, State> states; 
} 

class State { ... } 

우리는 또한 국가 이름 또는 약어 색인 0 개 이상의 BranchOffice 객체의 사전을 포함하는 회사의 클래스가 있습니다.

Country usa; 
Company companies[]; 

는 내가 원하는 것은 분기를 포함하는 주 객체의 배열입니다 :

class Company 
{ 
    Dictionary<string, BranchOffice> branches; 
} 

class BranchOffice { ... } 

우리가 작업하고있는 인스턴스는 하나의 국가 개체 및 회사 객체의 배열입니다. 내가 쓴 LINQ는 아래와 같습니다. 먼저 실제로 분기가 포함 된 모든 회사를 점유 한 다음 두 목록의 키를 비교하여 상태 목록에 가입합니다.

ToArray은 익명 형식을 반환합니다. 익명 형식을 강력한 형식으로 변환 할 수없는 이유를 알고 있습니다. 강력하게 형식화 된 배열을 얻기 위해 뭔가를 바꿀 수 있는지 판단하려고합니다. (전체적으로 LINQ를 작성하는 더 좋은 방법에 대한 제안이 열려 있습니다.)

모든 곳에서 BranchOffice로 캐스팅을 시도했습니다 (앞쪽에, 앞쪽에, list2에, 마지막으로 선택 될 때, 그리고 덜 가능성 있음). 후보자).

BranchOffice[] offices = 
(from cm in companies 
where cm.branches.Count > 0 
select new { 
     list2 = 
     (from br in cm.branches 
     join st in usa.states on br.Key equals st.Key 
     select st.Value 
     ) 
} 
).ToArray(); 
+0

'BranchOffice' 클래스는 어떻게 생겼습니까? – BrokenGlass

답변

0

내가 제대로 문제를 이해한다면, 당신은 지점이 아닌 사무실의 브랜치가있는 상태를 원할뿐입니다. 당신이 국가와 가지 모두를 원하는 경우

State[] offices = 
(from cm in companies 
where cm.branches.Count > 0 
from br in cm.branches 
join st in usa.states on br.Key equals st.Key 
select st.Value 
).Distinct().ToArray(); 

는, 다음으로 그룹을해야 할 것이며, 그 결과는 당신이 처리 할 수있는>를 IEnumerable 될 것입니다 : 그렇다면, 하나의 추적 할 수없는 가망의 LINQ는이 다음이다 후. 당신이 국가 및 사전 선언 지점을 가지고 있더라도 그냥 한 가지 더

var statesAndBranches = 
from cm in companies 
where cm.branches.Count > 0 
from br in cm.branches 
join st in usa.states on br.Key equals st.Key 
group br.Value by st.Value into g 
select g; 

, 그들은 (사전에 keyValuePair에서)을 IEnumerable로 사용된다 그래서 당신은 어떤 반환 한 혜택이 그들을 형성받지 않습니다.

1

당신은 할 수 있습니다 :

select new MyClassOfSomeType { 
    .. 
) 

는 선택을 위해, 당신은 그것을 사용자 정의 클래스 유형을 제공 할 수 있습니다. 그런 다음 ToList를 사용할 수도 있습니다. ArrayList를 사용하여 느슨하게 입력해야한다면 익명 클래스를 생성하지 않는 선택 결과에 대해서만 캐스트 <>을 사용하여 강하게 입력 할 수 있습니다.

HTH.

관련 문제