LINQ从XDocument查询结果

时间:2013-06-14 16:50:10

标签: c# xml linq

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

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语句是什么?如何搜索resultTranslated ??

3 个答案:

答案 0 :(得分:5)

看起来您只想获得指定名称的匹配值,在这种情况下,您希望使用将返回标量值的标准查询运算符,例如Single

var value = resultTranslated.Single(r => r.Name == name).Value;
如果没有匹配或者有多个匹配,

Single将抛出异常。

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

答案 1 :(得分:1)

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

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];

答案 2 :(得分:1)

  

//从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。