【发布时间】:2011-07-06 21:10:35
【问题描述】:
以下是两个以不同方式做同一件事的示例。我在比较它们。
版本 1
举个例子,定义任何方法来根据业务逻辑从XElement 创建和返回ExpandoObject:
var ToExpando = new Func<XElement, ExpandoObject>(xClient =>
{
dynamic o = new ExpandoObject();
o.OnlineDetails = new ExpandoObject();
o.OnlineDetails.Password = xClient.Element(XKey.onlineDetails).Element(XKey.password).Value;
o.OnlineDetails.Roles = xClient.Element(XKey.onlineDetails).Element(XKey.roles).Elements(XKey.roleId).Select(xroleid => xroleid.Value);
// More fields TBD.
}
从 LINQ to XML 查询调用上述委托:
var qClients =
from client in xdoc.Root.Element(XKey.clients).Elements(XKey.client)
select ToExpando(client);
版本 2
在 LINQ 查询中执行所有操作,包括创建和调用 Func 委托。
var qClients =
from client in xdoc.Root.Element(XKey.clients).Elements(XKey.client)
select (new Func<ExpandoObject>(() =>
{
dynamic o = new ExpandoObject();
o.OnlineDetails = new ExpandoObject();
o.OnlineDetails.Password = client.Element(XKey.onlineDetails).Element(XKey.password).Value;
o.OnlineDetails.Roles = client.Element(XKey.onlineDetails).Element(XKey.roles).Elements(XKey.roleId).Select(xroleid => xroleid.Value);
// More fields TBD.
return o;
}))();
考虑到委托创建在select 部分,版本2 效率低吗?它是由 C# 编译器或运行时管理或优化的,因此无关紧要吗?
我喜欢版本 2 的紧凑性(将对象创建逻辑保留在查询中),但我知道它可能不可行,具体取决于编译器或运行时的功能。
【问题讨论】:
-
为什么是动态?似乎
o的类型在编译时就知道了... -
@Billy ONeal:据我所知,如果不使用
dynamic,您将无法展开 ExpandoObject。 -
哎呀——我以为 ExpandoObject 是你定义的类型。
标签: c# .net linq optimization clr