我设计了这个例子,因为它是我想要解决的实际问题的一个容易消化的版本。以下是课程及其关系。
首先,我们有一个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();
答案 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),因此您不会从中获得任何性能优势。