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
循环非常荒谬。你也可以打最后一个电话
;这至少会让意图变得清晰。