Можно ли получить другую коллекцию, кроме IEnumerable <T>, при использовании LINQ: XML для объекта? - PullRequest
1 голос
/ 20 июля 2010

Итак, у меня есть этот огромный XML-файл, который я преобразовываю в объект с помощью LINQ. И в настоящее время я делаю:

var resultStories = from story in resultXML.Descendants("story")
                    select new NewsStory
                    {
                        ArticleFrequency = from tag in story.Descendants("tag")
                                           select new KeyValuePair<string,int>((string)tag.Element("name"),(int)tag.Element("count"))
                    };

Теперь это дает мне 1004 *. Но мне интересно, можно ли получить другую коллекцию, например Dictionary<String,int> или List<new MyItem(string key, int value)?

У меня есть эта огромная книга LINQ, и она содержит только информацию об объектах в XML.
Этот вопрос относится к XML для объектов.

Спасибо:)

Ответы [ 2 ]

3 голосов
/ 20 июля 2010

Да, это возможно с использованием метода Linqs ToDictionary .

Вы должны быть в состоянии сказать

ArticleFrequency = (from tag in story.Descendants("tag")
                    select new
                    { 
                        Key = (string)tag.Element("name"),
                        Value = (int)tag.Element("count")
                    }).ToDictionary(val => val.Key, val => val.Value)

Ваша ArticleFrequency собственность, конечно, должна быть типа IDictionary<string, int>

ОБНОВЛЕНИЕ Чтобы ответить на ваш вопрос в комментариях (если я правильно понимаю), просто измените Выберите , чтобы получить Enumerable желаемого типа, например

ArticleFrequency = (from tag in story.Descendants("tag")
                    select new MyCustomObject()
                    { 
                        MyPropertyOne = (string)tag.Element("name"),
                        MyPropertyTwo = (int)tag.Element("count")
                    })

назначит IEnumerable<MyCustomObject> для ArticleFrequency. Если вы говорите, что хотите, чтобы ArticleFrequency имел тип Stack, вы можете просто обернуть весь запрос Linq и использовать его в качестве параметра IEnumerable для перегрузки конструктора стека например,

ArticleFrequency = new Stack<KeyValuePair<string, int>>(
                        (from tag in story.Descendants("tag")
                        select new KeyValuePair<string, int>()
                        { 
                            Key = (string)tag.Element("name"),
                            Value = (int)tag.Element("count")
                        }))
1 голос
/ 20 июля 2010

Вы можете заставить его возвращать словарь так:

ArticleFrequency = story.Descendants("tag").ToDictionary<XElement, string,int>()(
    tag=>(string)tag.Element("name"),
    tag=>(int)tag.Element("count")
);
...