这是我的代码:
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的定义。
这里的问题是匿名类型。
我尝试创建一个具有2个属性的新类:id,text和parent,语法有效,但树的定义无效。
所以这里的问题是如何对匿名类型进行查询,而不添加一个代表匿名类型的新类。
答案 0 :(得分:3)
如果您想在不创建新课程的情况下这样做,可以使用dynamic
进行过滤。
tree.item.Where(x => ((dynamic)x).id == 2).First()....
虽然这会给你一个匿名对象而不是一个集合,所以你不能添加任何东西。
答案 1 :(得分:1)
一,这真的很难看。你应该考虑为此声明一个类(你为此假设了一些纯粹主义者的暗示;)
二,你做的事情是不可能的。考虑一下,在你的第一个循环中当你tree.item.Where(x => x.id == 2).First()
时,你得到x
,这是一个对象而对象没有{{1 }} 方法。为了说明,请举例:
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;
}