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

时间:2018-01-25 12:01:29

标签: c# linq

我在C#中有这种代码,如果有更好的解决方案来计算public static string ConvertStringToUnicode(string inputString) { try { return Regex.Replace(inputString, "&", "\uff06").Replace("\"", "\uff02"); } catch (Exception ex) { throw; } } 属性,我很有意思:

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()); 属性调用StringParser.getBeforeString方法两次?

2 个答案:

答案 0 :(得分: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());

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

答案 1 :(得分:1)

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

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

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

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

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