[英]LINQ to query result from XDocument
我从资源文件中存储了所有数据元素,如下所示:
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?
看起来您只想获取指定名称的匹配值,在这种情况下,您想使用将返回标量值的标准查询运算符,例如Single
:
var value = resultTranslated.Single(r => r.Name == name).Value;
如果没有匹配项或有多个匹配项, Single
将引发异常。
另外,如果要获取第一个结果(如果没有,则抛出异常),也可以使用First
,或者使用SingleOrDefault
或FirstOrDefault
并根据需要进行null检查。
我相信您希望通过名称获得价值:
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
转换为dictionary:
var data = resultTranslated.ToDictionary(x => x.Name, x => x.Value);
然后,您将可以按名称获取值
if (data.ContainsKey(name))
value = data[name];
//从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调用很清楚,它只是一个键和值选择器,等效于您选择的new。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.