Нужна определенная команда LINQ, использующая let
Я хочу преобразовать цикл 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)
}
где я не смог представить "пусть".
Кто-нибудь может мне помочь?
2 ответа
Ты можешь использовать let
в foreach
цикл:
// 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 });
Дает мне мурашки по коже...
Я создал такую вещь, как:
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 лучше, удобочитаемее или эффективнее?
Я не уверен... или я написал неправильный код?