我在 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
方法在指定的分隔符之前获取字符串的内容。