2

私は最初にこれを行って、親ノードの下に 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. が、無効なキャスト例外が発生します。私はどこへ行くのか、レンガの壁にいます。何かアドバイス?

4

4 に答える 4

5

このWhereメソッドは を返しません。列挙時に遅延評価される をList<>返します。IEnumerable<>

実際のオブジェクトが必要な場合は、最後にList<>a を貼り付けてください。.ToList()

于 2013-02-11T21:36:21.883 に答える
4
var world1 = LevelData.root
                           .Elements("world")
                           .Where(element => (int?)element.Attribute("id") == 1)
                           .ToList();

IListインターフェイスはIEnumerableインターフェイスよりも多くの機能をサポートしているため、ToList()を使用してIEnumerableから変換する必要があります。

于 2013-02-11T21:36:11.027 に答える
2

あなたの質問は少し紛らわしいです、あなたはの配列を持っているようでList<IEnumerable<XElement>>、あなたはそれに割り当てようとしIEnumerable<XElement>ています。

これだけが必要な場合ListIEnumerable<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
}

それ以外の場合、touは、配列に追加する新しいリストを作成し、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
}
于 2013-02-11T21:55:39.100 に答える
2

を呼び出すことでIEnumerable<T>をに変換できますList<T>ToList()

List<XElement> world1 = LevelData.root
    .Elements("world")
    .Where(element => (int?)element.Attribute("id") == 1)
    .ToList();
于 2013-02-11T21:37:09.670 に答える