gpt4 book ai didi

c# - 内联 LINQ 查询创建委托(delegate)实例的效率?

转载 作者:太空宇宙 更新时间:2023-11-03 19:30:44 25 4
gpt4 key购买 nike

下面是两个用不同方式做同样事情的例子。我在比较他们。

版本 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 查询调用上述委托(delegate):

var qClients =
from client in xdoc.Root.Element(XKey.clients).Elements(XKey.client)
select ToExpando(client);

版本 2

在 LINQ 查询中完成所有操作,包括创建和调用 Func 委托(delegate)。

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;
}))();

考虑到委托(delegate)创建是在 select 部分,版本 2 效率低吗?它是由 C# 编译器或运行时管理或优化的,所以这无关紧要吗?

我喜欢版本 2 的紧凑性(在查询中保留对象创建逻辑),但我知道它可能不可行,具体取决于编译器或运行时的功能。

最佳答案

后一种方法在我看来非常糟糕。我相信它每次都必须真正创建一个新的委托(delegate),因为您每次都在捕获不同的客户,但就我个人而言,我根本不会那样做。既然你已经有了真正的陈述,为什么不写一个普通的方法呢?

private static ToExpando(XElement client)
{
// Possibly use an object initializer instead?
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);
return o;
}

然后查询:

var qClients = xdoc.Root.Element(XKey.clients)
.Elements(XKey.client)
.Select(ToExpando);

与创建委托(delegate)的性能相比,我更关心代码的可读性,后者通常很快。我认为没有必要像您目前热衷于使用的那样多地使用 lambda。想一想一年后你什么时候回来看这段代码。您真的会发现嵌套的 lambda 比方法更容易理解吗?

(顺便说一下,将转换逻辑分离到一个方法中可以轻松地进行隔离测试...)

编辑:即使您确实想在 LINQ 表达式中完成所有操作,您为什么如此热衷于创建另一个间接级别?仅仅因为查询表达式不允许语句 lambda 吗?鉴于您只做一个简单的选择,这很容易处理:

var qClients = xdoc.Root
.Element(XKey.clients)
.Elements(XKey.client)
.Select(client => {
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);
return o;
});

关于c# - 内联 LINQ 查询创建委托(delegate)实例的效率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5161221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com