我可以在 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());

有什么方法可以不为Name属性调用StringParser.getBeforeString方法两次?

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

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

或者,如果要查询语法,请使用 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();

一种方法是使用IndexOf来查看是否存在'('

Name = li.InnerText.IndexOf('(') < 0 ? li.InnerText : StringParser.getBeforeString("(", li.InnerText)

另一种方法是使用正则表达式而不是StringParser.getBeforeString

Name = Regex.Replace(li.InnerText, "(.*$", "")

这两种方法都假定StringParser.getBeforeString方法在指定的分隔符之前获取字符串的内容。

最新更新