我可以在linq中实现属性而不调用方法两次吗?

DVL*_*DVL 3 c# linq

我在C#中有这种代码,如果有更好的计算Name属性的解决方案,我很有意思:

dictItem.valueElement.Select(li => new ItemWithNameAndUrl {
    Name = StringParser.getBeforeString("(", li.InnerText) == string.Empty ?
        li.InnerText : StringParser.getBeforeString("(", li.InnerText), //don't like it
    Url = li.Element("a").Attributes["href"].Value
}).ToList());
Run Code Online (Sandbox Code Playgroud)

有没有办法不StringParser.getBeforeStringName属性调用方法两次?

Gil*_*een 5

您可以在变量中显式打开选择和存储结果中的范围:

var result = dictItem.valueElement.Select(li =>  {
    var name = StringParser.getBeforeString("(", li.InnerText);
    return new ItemWithNameAndUrl {
        Name = name == string.Empty?li.InnerText : name,
        Url = li.Element("a").Attributes["href"].Value
    }        
}).ToList());
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要查询语法,请使用let关键字:

var result = (from li in dictItem.valueElement
              let name = StringParser.getBeforeString("(", li.InnerText)
              select new ItemWithNameAndUrl {
                  Name = name == string.Empty ? li.InnerText : name,
                  Url = li.Element("a").Attributes["href"].Value
              }).ToList();
Run Code Online (Sandbox Code Playgroud)