2011-10-03 14 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。

相关问题