【问题标题】:Need certain LINQ command using let需要使用 let 的某些 LINQ 命令
【发布时间】: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有什么问题?

标签: linq loops foreach transform let


【解决方案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 真的更好、更易读或更高效吗?

    我不确定……还是我写错了代码?

    【讨论】:

    • 对不起,这应该在页面底部。我不同意这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 2012-03-08
    • 1970-01-01
    • 2021-09-12
    相关资源
    最近更新 更多