LINQ值查询返回错误的字符串

时间:2013-11-08 19:22:01

标签: c# xml linq

我一直在制作聊天程序。我正在做昵称函数,我希望程序在设置文件中获取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]值,但仍然存在问题。

3 个答案:

答案 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()