我从资源文件中存储了所有数据元素,如下所示:
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 ??
答案 0 :(得分:5)
看起来您只想获得指定名称的匹配值,在这种情况下,您希望使用将返回标量值的标准查询运算符,例如Single
:
var value = resultTranslated.Single(r => r.Name == name).Value;
如果没有匹配或者有多个匹配, Single
将抛出异常。
或者,如果您想获得第一个结果(如果没有则抛出异常),或First
或SingleOrDefault
,可以使用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。