Может ли LINQ ToArray вернуть массив со строгим типом в этом примере? - PullRequest
0 голосов
/ 03 октября 2011

Я придумал этот пример, потому что это легко усваиваемая версия проблемы, которую я пытаюсь решить.Вот классы и их отношения.

Сначала у нас есть класс Country, который содержит объекты Dictionary of State, проиндексированные строкой (например, их имя или сокращение).Содержимое класса State не имеет значения:

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

class State { ... }

У нас также есть класс Company, который содержит словарь из нуля или более объектов BranchOffice, также проиндексированных именами или сокращениями состояний.

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

class BranchOffice { ... }

Экземплярами, с которыми мы работаем, являются один объект Country и массив объектов Company:

Country usa;
Company companies[];

Я хочу получить массив объектов State, содержащих ветвь.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();

Ответы [ 2 ]

1 голос
/ 03 октября 2011

Вы можете сделать:

 select new MyClassOfSomeType {
   ..
)

Для выбора вы можете задать ему тип пользовательского класса.Вы также можете использовать ToList.С ArrayList, если вам нужно сохранить его свободно напечатанным, вы можете затем сделать его строго типизированным позже, используя Cast <>, но только для любого результата выбора, который не создает анонимный класс.*

0 голосов
/ 03 октября 2011

Если я правильно понимаю проблему, вам нужны только штаты, в которых есть офисные отделения, а не филиалы. Если это так, один возможный 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;

Еще одна вещь, даже если у вас есть страны и филиалы, объявленные как словари, они используются как IEnumerable (из словаря keyValuePair), поэтому вы не получите никакой выгоды от них.

...