2

我一直在做一个聊天程序。我正在做昵称功能,我希望程序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]值,但仍然存在问题。

4

3 回答 3

4

您打算找到一个字符串,但您都将其包装在一个匿名对象中,并且您有一个零到多个项目的序列,而不仅仅是一个项目。

首先,不要使用匿名对象,只选择字符串值。

接下来,如果您只想要一个项目,而不是一个序列,您需要决定您想要什么项目。你想要第一个项目吗?然后使用诸如FirstOrDefault获取该项目的方法。

var data = (from item in doc.Descendants("settings")
            select item.Element("nick").Value)
            .FirstOrDefault();
return data;
于 2013-11-08T19:27:30.963 回答
2

您需要引用i而不是data在循环中。此外,无需转换匿名对象.ToString并对其进行解析,只需nick直接引用匿名属性:

foreach (var i in data)
{
    temp = i.nick;
}
return temp;

如果您打算始终只有一个值,那么也不需要循环。直接用 LINQ 获取结果:

return data.Single().nick;
于 2013-11-08T19:28:20.700 回答
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().

于 2013-11-08T19:36:34.010 回答