我一直在制作聊天程序。我正在做昵称函数,我希望程序在设置文件中获取nick
元素的值。但是,当我运行程序时,它返回字符串的类型,而不是它的值。如果它应该是值:
Your current nickname is System.Linq.Enumerable+WhereSelectEnumerableIterator2[System.Xml.Linq.XElement,<>f__AnonymousType01[System.String]]
<ilanChat>
<settings>
<nick>User</nick>
</settings>
</ilanChat>
代码是:
public string GetNick()
{
string temp = "hello";
ClientClass prog = new ClientClass();
XDocument doc = XDocument.Load(prog.settingsFile);
var data = from item in doc.Descendants("settings")
select new
{
nick = item.Element("nick").Value
};
foreach (var i in data)
{
temp = data.ToString();
temp = temp.Replace("{ name = ", "");
temp = temp.Replace("}", "").Trim();
}
return temp;
}
但它返回上述问题。我还尝试将temp
添加到列表中,然后返回[0]
值,但仍然存在问题。
答案 0 :(得分:4)
您打算找到一个字符串,但是您要将它包装在一个匿名对象中,以及您有一个零到多个项目的序列,而不仅仅是一个项目
首先,不要使用匿名对象,只需选择字符串值。
接下来,如果您只想要一个项目而不是序列,则需要确定您想要的项目。你想要第一件商品吗?然后使用FirstOrDefault
等方法获取该项目。
var data = (from item in doc.Descendants("settings")
select item.Element("nick").Value)
.FirstOrDefault();
return data;
答案 1 :(得分:2)
您需要在循环中引用i
而不是data
。此外,不是转换匿名对象.ToString
并解析它,而是直接引用匿名属性nick
:
foreach (var i in data)
{
temp = i.nick;
}
return temp;
如果您打算始终只有一个值,那么也不需要循环。只需使用LINQ:
直接获取结果return data.Single().nick;
答案 2 :(得分:0)
如果您只想在<nick>
下方找到一个<settings>
元素,则可以大大简化您的方法:
public static string GetNick()
{
ClientClass prog = new ClientClass();
XDocument doc = XDocument.Load(prog.settingsFile);
return (string)doc.Descendants("settings").Elements("nick").FirstOrDefault();
}
如果没有匹配的值,这将只返回null
。如果元素丢失,到目前为止发布的其他答案将会抛出。
我没有深入研究如何处理重复的<nick>
或<settings>
标记,因为可能性很多。该解决方案采用“第一次获胜”的方法; “最后获胜”方法只需要将FirstOrDefault()
替换为LastOrDefault()
。