2

これは私のコードです:

var tree = new
{
    id = "0",
    item = new List<object>()
};

foreach ()
{
    tree.item.Add(new
    {
        id = my_id,
        text = my_name,
        parent = my_par
    });
}

しかし、foreach のコードを次のように置き換えたいと思います。

foreach ()
{
    tree.item.Where(x => x.id == 2).First().Add(new
    {
        id = my_id,
        text = my_name,
        parent = my_par
    });
}

これを行う方法?タイプに id の定義が含まれていないという例外が発生します。

ここでの問題は匿名型です。

id、text、parent の 2 つのプロパティを持つ新しいクラスを作成しようとしましたが、構文は機能しましたが、ツリーの定義が無効でした。

したがって、ここでの質問は、匿名型を表す新しいクラスを追加せずに、匿名型へのクエリを作成する方法です。

4

2 に答える 2

3

新しいクラスを作成せずに実行したい場合はdynamic、フィルタリングに使用できます。

tree.item.Where(x => ((dynamic)x).id == 2).First()....

ただし、コレクションではなく単一の匿名オブジェクトが提供されるため、何も追加できません。

于 2013-06-13T11:07:51.117 に答える
1

1つ、これは本当に醜いです。このためのクラスを宣言することを検討する必要があります (これについて純粋主義者から反対票を投じられたと思います;))

2、あなたは不可能なことをしている。これについて考えてみてください。最初のループでを実行するとtree.item.Where(x => x.id == 2).First()、戻ってきます。xこれはオブジェクトであり、オブジェクトにはメソッドがありませんAdd。説明のために、次の例を取り上げます。

var tree = new
{
    id = "0",
    item = new List<object> 
    { 
        new
        {
            id = 2,
            text = "",
            parent = null
        }
    }
};

今あなたがするとき

var p = tree.item.Where(x => x.id == 2).First(); //even if that was compilable.

あなたはこれを手に入れています

new
{
    id = 2,
    text = "",
    parent = null
}

戻る。Add今、あなたはそれに何かをするつもりですか?これは実際にはメソッドを持たない匿名型です。

私は推測することしかできませんが、これが必要な場合があります:

var treeCollection = new
{
    id = 0,
    item = new List<object> // adding a sample value
    { 
        new // a sample set
        {
            id = 2, 
            text = "",
            parent = null // some object
        }
    }
}.Yield(); // an example to make it a collection. I assume it should be a collection

foreach (var tree in treeCollection)
{
    if (tree.id == 0)
        tree.item.Add(new
        {
            id = 1,
            text = "",
            parent = null
        });
}

public static IEnumerable<T> Yield<T>(this T item)
{
    yield return item;
}

または1行で:

treeCollection.Where(x => x.id == 0).First().item.Add(new
{
    id = 1,
    text = "",
    parent = null
});
于 2013-06-13T11:57:12.107 に答える