LINQ ToArray可以在此示例中返回强类型数组吗?

时间:2011-10-03 01:38:03

标签: linq linq-to-objects

我设计了这个例子,因为它是我想要解决的实际问题的一个容易消化的版本。以下是课程及其关系。

首先,我们有一个Country类,其中包含一个由字符串索引的State of Dictionary对象(例如,它们的名称或缩写)。国家阶级的内容无关紧要:

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

class State { ... }

我们还有一个Company类,其中包含零个或多个BranchOffice对象的Dictionary,这些对象也由州名或缩写索引。

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

class BranchOffice { ... }

我们正在使用的实例是一个Country对象和一组Company对象:

Country usa;
Company companies[];

我想要的是包含分支的State对象数组。我写的LINQ如下。首先,它抓住所有实际包含分支的公司,然后通过比较两个列表的键来加入状态列表。

问题是ToArray返回匿名类型。我理解为什么匿名类型不能转换为强类型。我想弄清楚我是否可以改变一些东西以获得强类型数组。 (我对有关更好地编写LINQ的方法的建议持开放态度。)

我已尝试在整个地方(预先,在list2,最终选择和其他不太可能的候选人)上投射到BranchOffice。

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

2 个答案:

答案 0 :(得分:1)

你可以这样做:

 select new MyClassOfSomeType {
   ..
)

如需选择,您可以为其提供自定义类类型。然后,您也可以使用ToList。使用ArrayList,如果您需要保持松散类型,则可以稍后使用Cast&lt;&gt;强制键入它,但仅适用于不生成匿名类的任何选择结果。

HTH。

答案 1 :(得分: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&gt;,你可以在之后处理。

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;

还有一件事,即使您将国家和分支声明为词典,它们也被用作IEnumerable(来自字典中的keyValuePair),因此您不会从中获得任何性能优势。