Как транслировать в список ‹IEnumerable ‹XElement››

Я делал это сначала, чтобы вернуть определенный набор узлов под родительским узлом, у которого id был равен 1, что фантастически работало.

IEnumerable<XElement> world1 = LevelData.root.
                               Elements("world").
                               Where(element => (int?)element.Attribute("id") == 1);

Но мне нужно было сделать это несколько раз, и у каждого был собственный экземпляр, поэтому я решил поместить их в список, но он даже не компилируется, сообщая мне об ошибке CS0266:

Невозможно неявно преобразовать тип System.Collections.Generic.IEnumerable в System.Collections.Generic.List>. Существует явное преобразование (вам не хватает приведения?)

List<IEnumerable<XElement>>[] World = new List<IEnumerable<XElement>>[noofworlds];

        foreach (List<IEnumerable<XElement>> wn in World)
        {
            Debug.WriteLine("World: "+w);

            //this will make a list of all the nodes (elements) within the world specified by the id tag
            World[w] =  LevelData.Root.Elements("world").Where(element => (int?)element.Attribute("id") == 1);//with id == to i
            w++;
        }

Итак, я попытался добавить приведение List<IEnumerable<XElement>> непосредственно перед LevelData.root., но затем получил недопустимое исключение. Я у кирпичной стены не знаю, куда идти. Любой совет?


person Russell Cargill    schedule 11.02.2013    source источник
comment
Ваша переменная World представляет собой массив списков IEnumerable из XElement. Я почти уверен, что ты никогда не захочешь этого делать.   -  person juharr    schedule 12.02.2013
comment
Почему ты никогда не хочешь этого делать? в чем недостатки?   -  person Russell Cargill    schedule 12.02.2013


Ответы (4)


Метод Where не возвращает List<>, он возвращает IEnumerable<>, который вычисляется лениво при перечислении.

Если вам нужен настоящий List<> объект, прикрепите .ToList() в конце, и это будет.

person David Yaw    schedule 11.02.2013

var world1 = LevelData.root
                           .Elements("world")
                           .Where(element => (int?)element.Attribute("id") == 1)
                           .ToList();

Вам необходимо использовать ToList (), чтобы преобразовать его из IEnumerable, потому что IList поддерживает больше функций, чем IEnumerable.

person Ryan Gates    schedule 11.02.2013

Вы можете преобразовать IEnumerable<T> в List<T>, вызвав ToList()

List<XElement> world1 = LevelData.root
    .Elements("world")
    .Where(element => (int?)element.Attribute("id") == 1)
    .ToList();
person Khan    schedule 11.02.2013

Ваш вопрос немного сбивает с толку, похоже, у вас есть массив List<IEnumerable<XElement>>, и вы пытаетесь присвоить ему IEnumerable<XElement>.

Если вам просто нужно List из IEnumerable<XElement>, это должно сработать

List<IEnumerable<XElement>> World = new List<IEnumerable<XElement>>();
for (int i = 0; i < noofworlds; i++)
{
    World.Add(LevelData.Root.Elements("world").Where(element => (int?)element.Attribute("id") == i));//with id == to i
}

В противном случае вам придется создать новый список для добавления в массив и добавить IEnumerable<XElement> в этот список.

List<IEnumerable<XElement>>[] World = new List<IEnumerable<XElement>>[noofworlds];
for (int i = 0; i < noofworlds; i++)
{
    World[i] = new List<IEnumerable<XElement>> { (LevelData.Root.Elements("world").Where(element => (int?)element.Attribute("id") == i)) };//with id == to i
}
person sa_ddam213    schedule 11.02.2013