2012-04-19 40 views
0

爲什麼當我這樣做:System.Linq的爲String問題與GET請求

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請求串起來?

+1

您是否期待MessageID只有一個值?嘗試'FirstOrDefault()'而不是'.ToString()'。 LINQ查詢將通過設計返回一個集合(即使它只有一個元素),當你調用.ToString()時,你會得到奇怪的輸出(爲什麼.ToString()返回你的'再見)。 – Tim 2012-04-19 04:42:27

+0

+1我也是大聲笑... – 2012-04-19 04:48:38

回答

4

您的LINQ查詢正在調用.Descendants的調用性質。如果只有一個,則可以使用.Single().First().FirstOrDefault()獲取列表中唯一的(或第一個)項目。

那麼這將是

textbox1.Text = MessageID.MessageID; 

雖然你更有可能想要做這樣的事情:

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

但我有些猜測,因爲我不知道的格式或內容的XML。

+0

+1 Horray!謝謝。 – 2012-04-19 04:50:10

1

這裏有其他人可以給你一個更詳細的解釋,但這裏是我認爲正在發生的事情(從我上面的評論擴展)。

默認情況下,即使只有一個結果,LINQ查詢也會返回一個集合。當您在該集合上調用.ToString()時,您將獲得對象類型的完全限定名稱。請參閱Object.ToString Method - 在這種情況下,我認爲這是您獲得的奇怪輸出。

你可能尋找一個單一的結果(郵件ID),因此您可以使用.FirstOrDefault(),而不是.ToString(),像這樣:

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

注意n.Element("MessageID").Value將返回一個字符串,然後你就可以分配給TextBox。

當您將查詢轉換爲List時,您可以將其綁定到DataGridView的DataSource,因爲DataSource使用實現IList接口之一的對象(在通用列表的情況下爲IList)。