【问题标题】:LINQ to query result from XDocumentLINQ 从 XDocument 查询结果
【发布时间】:2013-06-14 16:50:10
【问题描述】:

我从资源文件中存储了所有数据元素,如下所示:

XDocument xDocTranslated = XDocument.Load(TranslatedFile);
var resultTranslated = from item in xDocTranslated.Descendants("data")
select new
{
    Name = (string)item.Attribute("name"),
    Value = (string)item.Element("value")
};

我有一个字符串列表,我想与上面的结果进行比较,如果它们匹配,我想存储新值。

我正在尝试这样的事情:

//Get each string that i want to translate
foreach (var name in StringsToTranslatelist)
{
    //Look up the translated value from data extracted from xml file
    var value= from entry in resultTranslated
        where entry.Name == name;                  <--this does not work

}

我应该在这里使用什么 LINQ 语句?如何搜索结果翻译??

【问题讨论】:

  • 这不起作用是什么意思?例外?

标签: c# xml linq


【解决方案1】:

您似乎只想获取指定名称的匹配值,在这种情况下,您想使用标准查询运算符,该运算符将返回一个标量值,例如Single

var value = resultTranslated.Single(r => r.Name == name).Value;

Single 将在没有匹配或有多个匹配时抛出异常。

或者,如果您想获得第一个结果,您可以使用First(如果没有则抛出异常),或者SingleOrDefaultFirstOrDefault,并根据您的要求自行进行空值检查。

【讨论】:

  • XElement 和 XAttribute 具有自定义的显式转换运算符,这将使他的代码正常工作。
【解决方案2】:

我相信你想通过名字获得价值:

foreach (var name in StringsToTranslatelist)
{
    var data =  resultTranslated.FirstOrDefault(e => e.Name == name);
    if (data != null)
    {
        // match is found, you can use value
        var value = data.Value;
    }
}

但更有效的方法是将resultTranslated 转换为字典:

var data = resultTranslated.ToDictionary(x => x.Name, x => x.Value);

然后你就可以通过名字获取值了

if (data.ContainsKey(name))
    value = data[name];

【讨论】:

    【解决方案3】:

    //从xml文件提取的数据中查找翻译后的值

    对我来说,立即看起来像字典查找将是最合适的。

    所以代码可能是:

    //creating the dictionary from the xml doc
    var resultTranslatedLookup = xDocTranslated.Descendants("data")
                         .ToDictionary(keyItem => keyItem.Attribute("name").Value
                         , valItem => valItem.Element("value").Value);
    
    //now usage
    foreach (var name in StringsToTranslatelist)
    {
        string result;
        if (resultTranslatedLookup.TryGetValue(name, out result))
        {
            //do your thing
        }
    }
    

    希望 ToDictionary 调用清晰,那只是一个键值选择器,相当于你的 select new。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多