0

为什么当我这样做时:

    private void button18_Click(object sender, EventArgs e)
    {

        string uri1 = "http://localhost:8000/Service/GetMessage/{anything}";
        string tagUri = uri1.Replace("{anything}", textBox21.Text);
        XDocument xDoc = XDocument.Load(tagUri);
        var MessageID = xDoc.Descendants("Message")
                             .Select(n => new
                             {
                                 MessageID = n.Element("MessageID").Value,
                             })
            .ToString();

        textBox1.Text = MessageID;

我得到这个非常奇怪的输出?

System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Xml.Linq.XElement,<>f__AnonymousType7`1[System.String]]

但是,当我将 ToString 更改为 ToList 并使用:

dataGridView10.DataSource = MessageID;

它正确显示吗?真的很难找到将传入的 GET 请求转换为字符串的方法吗?

4

2 回答 2

4

您的 LINQ 查询通过对.Descendants. 如果只有一个,您可以使用.Single()or.First().FirstOrDefault()来获取列表中的唯一(或第一个)项目。

那么它将是

textbox1.Text = MessageID.MessageID;

尽管您更有可能想做这样的事情:

var MessageId = xDoc.Element("Message").Element("MessageID").Value;

但我有点猜测,因为我不知道您的 XML 的格式或内容。

于 2012-04-19T04:45:03.307 回答
1

这里还有其他人可以为您提供更详细的解释,但这是我认为正在发生的事情(从我上面的评论扩展而来)。

默认情况下,LINQ 查询返回一个集合,即使只有一个结果。当您调用.ToString()该集合时,您将获得对象类型的完全限定名称。请参阅Object.ToString 方法- 在这种情况下,我相信这是您得到的奇怪输出。

您可能正在寻找单个结果 (MessageID),因此您可以使用.FirstOrDefault()而不是.ToString(),如下所示:

var MessageID = xDoc.Descendants("Message")
                .Select(n => new
                {
                    MessageID = n.Element("MessageID").Value,
                })
                .FirstOrDefault();

请注意,这n.Element("MessageID").Value将返回一个字符串,然后您可以将其分配给 TextBox。

当您将查询转换为列表时,您可以将其绑定到 DataGridView 的 DataSource,因为 DataSource 采用实现IList接口之一的对象(IList在通用列表的情况下)。

于 2012-04-19T04:53:08.683 回答