2011-10-03 44 views
0

我已經設計了這個例子,因爲它是我試圖解決的實際問題的一個容易消化的版本。這裏是類和他們的關係。LINQ ToArray在這個例子中能返回一個強類型的數組嗎?

首先,我們有一個Country類,它包含一個字符串索引的State對象字典(例如它們的名稱或縮寫)。 State類的內容是無關緊要的:

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

class State { ... } 

我們也有一個包含零個或多個BranchOffice對象也由國家名稱或縮寫收錄的詞典一類公司。

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

class BranchOffice { ... } 

我們正在使用的情況下,是一個國家目標和企業對象的數組:

Country usa; 
Company companies[]; 

我要的是包含一個分支國家對象的數組。我寫的LINQ如下。首先它抓住所有實際包含分支的公司,然後通過比較兩個列表的關鍵字來加入狀態列表。

問題是ToArray返回一個匿名類型。我明白爲什麼匿名類型不能轉換爲強類型。我試圖弄清楚我是否可以改變某些東西來取回強類型數組。 (並且我接受關於更好地寫LINQ的建議)

我已經試過在所有的地方都投射到分支辦公室(前面,在列表2,最後選擇,以及其他不太可能候選人)。

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

如果我正確地理解了這個問題,那麼你只需要那些在辦公室裏有分支的州,而不是分支。如果是這樣,一個更多鈔票LINQ如下:

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>,您可以處理後。

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的,所以你不會得到任何好處PERF它們形成。

1

你可以這樣做:

select new MyClassOfSomeType { 
    .. 
) 

供選擇,你可以給它一個自定義的類類型。您也可以使用ToList。使用ArrayList,如果您需要保持鬆散類型,則可以稍後使用Cast <>強制類型化,但僅適用於任何不會生成匿名類的選擇結果。

HTH。

相關問題