C# LINQ值查询返回错误的字符串
我一直在做一个聊天节目。我正在执行昵称函数,我希望程序获得设置文件中C# LINQ值查询返回错误的字符串,c#,xml,linq,C#,Xml,Linq,我一直在做一个聊天节目。我正在执行昵称函数,我希望程序获得设置文件中nick元素的值。但是,当我运行程序时,它返回字符串的类型,而不是字符串的值。输出为您当前的昵称为System.Linq.Enumerable+WhereSelectEnumerableIterator2[System.Xml.Linq.XElement,f_uAnonymousType01[System.String]],其值应为: <ilanChat> <settings> &
nick
元素的值。但是,当我运行程序时,它返回字符串的类型,而不是字符串的值。输出为您当前的昵称为System.Linq.Enumerable+WhereSelectEnumerableIterator2[System.Xml.Linq.XElement,f_uAnonymousType01[System.String]]
,其值应为:
<ilanChat>
<settings>
<nick>User</nick>
</settings>
</ilanChat>
但它返回了前面提到的问题。我还尝试将
temp
添加到列表中,然后返回[0]
值,但仍然存在问题。您打算查找单个字符串,但您都将其包装在匿名对象中,并且事实上,您对许多项都有一个零序列,而不仅仅是一项
var data = (from item in doc.Descendants("settings")
select item.Element("nick").Value)
.FirstOrDefault();
return data;
首先,不要使用匿名对象,只需选择字符串值即可
接下来,如果您只想要一个项目,而不是一个序列,那么您需要决定您想要什么项目。你想要第一件吗?然后使用诸如FirstOrDefault
之类的方法获取该项
var data = (from item in doc.Descendants("settings")
select item.Element("nick").Value)
.FirstOrDefault();
return data;
您需要在循环中引用
i
,而不是数据。另外,与其将匿名对象.ToString
转换并解析它,不如直接引用匿名属性nick
:
foreach (var i in data)
{
temp = i.nick;
}
return temp;
如果希望始终只有一个值,那么也不需要循环。只需使用LINQ直接获取结果:
return data.Single().nick;
如果只想在
的正下方找到单个
元素,可以大大简化方法:
public static string GetNick()
{
ClientClass prog = new ClientClass();
XDocument doc = XDocument.Load(prog.settingsFile);
return (string)doc.Descendants("settings").Elements("nick").FirstOrDefault();
}
如果没有匹配值,这将简单地返回null
。如果元素丢失,那么到目前为止发布的其他答案将抛出
我不会深入探讨如何处理重复的
或
标记,因为可能性很多。该解决方案采用“第一价值赢”的方法;“最后一个值获胜”的方法只需要将FirstOrDefault()
替换为LastOrDefault()
我想你想要的是I.ToString()
而不是data.ToString()
。这甚至没有编译:Pwell,Deafult
?:P@KingKing好的,谢谢。将来您可以编辑类似的内容。这将在缺少的
元素上抛出NullReferenceException
;我认为在这种情况下返回null
会更明智。@MikeStrobel我想这取决于具体情况。如果有一个settings
元素而没有nick
是有效的,那么是的,需要考虑这一点。如果这种情况是无效文件,则可能需要抛出异常,而不是忽略问题。这样的foreach
循环非常荒谬。你也可以打最后一个电话
;这至少会让意图变得清晰。