需要使用 let 的某些 LINQ 命令
Posted
技术标签:
【中文标题】需要使用 let 的某些 LINQ 命令【英文标题】:Need certain LINQ command using let 【发布时间】:2014-09-28 06:04:28 【问题描述】:我想将 foreach 循环转换为 LINQ。 代码如下所示:
foreach (XmlNode localNode in localXmlNodeList)
var localKeyNode = localNode.SelectSingleNode(inputKeyName);
var localValueNode = localNode.SelectSingleNode(inputValueName);
if ((localKeyNode == null) || (localValueNode == null))
continue;
localReturn.Add(localKeyNode.InnerText, localValueNode.InnerText);
我想使用类似的东西:
from X in Y
let varA = Y.A
let varB = Y.B
where method(varA, varB)
select varA, varB;
但我最终总是使用如下的 foreach 循环:
foreach(var X in Y.Where(varA => something(varA.subA.microSubA, varB.subB.microSubB)))
somethingAgain(varA.subA.microSubA, varB.subB.microSubB)
我无法介绍“让”。
有人可以帮帮我吗?
【问题讨论】:
用foreach代替Linq有什么问题? 【参考方案1】:您可以在foreach
循环中使用let
:
// Query modified slightly to make more sense...
foreach (var X in from X in Y
let varA = X.A
let varB = X.B
where method(varA, varB)
select new varA, varB )
它很丑,但它应该仍然有效 - 它只是一种表达方式。
或者,更好的 IMO,首先声明一个单独的查询变量:
var query = from X in Y
let varA = X.A
let varB = X.B
where method(varA, varB)
select new varA, varB ;
foreach (var X in query)
...
当然,let
实际上只是对应另一个Select
来引入范围变量——所以你也可以用点表示法来表达它:
var query = Y.Select(X => new X, varA = X.VarA )
.Select(p => new p.X, p.varA, varB = p.X.VarB )
.Where(p => method(p.varA, p.varB))
.Select(p => new p.varA, p.varB );
【讨论】:
【参考方案2】:让我毛骨悚然...
我创建了一个类似的东西:
foreach(var localNode in localXmlNodeList.Cast<XmlNode>()
.Select(localPseudo => new localPseudoKeyNode = localPseudo.SelectSingleNode(inputKeyName), localPseudoValueNode = localPseudo.SelectSingleNode(inputValueName) )
.Where(localSuperPseudo => (localSuperPseudo.localPseudoKeyNode != null) && (localSuperPseudo.localPseudoValueNode != null))
.Select(localMegaPseudo => new localPseudoKey = localMegaPseudo.localPseudoKeyNode.InnerText, localPseudoValue = localMegaPseudo.localPseudoValueNode.InnerText ))
localReturn.Add(localNode.localPseudoKey, localNode.localPseudoValue);
代替:
foreach (XmlNode localNode in localXmlNodeList)
var localKeyNode = localNode.SelectSingleNode(inputKeyName);
var localValueNode = localNode.SelectSingleNode(inputValueName);
if ((localKeyNode == null) || (localValueNode == null))
continue;
localReturn.Add(localKeyNode.InnerText, localValueNode.InnerText);
现在,LINQ 真的更好、更易读或更高效吗?
我不确定……还是我写错了代码?
【讨论】:
对不起,这应该在页面底部。我不同意这个。以上是关于需要使用 let 的某些 LINQ 命令的主要内容,如果未能解决你的问题,请参考以下文章
等效于链式 LINQ 扩展方法调用中的 'let' 关键字的代码