2011-09-18 79 views
1

我有以下的LINQ表達式:轉換輸出的Int16

var ageEntry = from entry in args 
          where (entry.Key == "Age") 
          select entry.Value; 

//I want age as Int16: 
Int16 age = Convert.ToInt16(ageEntry); 

但是我得到以下異常:

無法轉換 類型的對象WhereSelectEnumerableIterator 2[System.Collections.Generic.KeyValuePair 2 System.String,System.String],System.String]' 鍵入'System.IConvertible'。

這不是我見過的最清晰的例外,有人可以請給我解釋一下嗎?

回答

3

首先,ageEntry是作爲查詢結果的序列。它看起來像你期望你的查詢有一個單一的結果。因此,你可以說:

short age = Convert.ToInt16(ageEntry.Single()); 

這不是我見過的最清晰的異常,可有人請解釋這樣對我?

其實它很清楚。它告訴你,ageEntry的類型是WhereSelectEnumerableIterator2[System.Collections.Generic.KeyValuePair2[System.String,System.String],System.String],它不能轉換它。這是您的主要線索,ageEntry不代表一個數字或可以轉換爲您認爲應該的數字的東西。

相反,它代表一個查詢過濾和投影某個序列(在你的案例中,args)。基本上,ageEntry知道如何通過KeyValuePair<string, string>的序列進行過濾,並且投影到string。這就是爲什麼你必須使用Enumerable.Single。你的意思是「給我一個來自查詢的結果,這個結果來自做所有的過濾,並且預測你知道該怎麼做(順便說一句,如果沒有單個結果,拋出異常)」。

0

你當前的輸入是一個IEnumerable<string>但你需要一個string值作爲輸入 - 試試這個:

Int16 age = Convert.ToInt16(ageEntry.Single()); 

這使得假設有一個在您ageEntry枚舉其實只有一個字符串值,否則將會拋出異常 - 根據您的實際情況,Single()的替代值爲First()將採用第一個值,而不管枚舉中有多少個或第一個值爲缺省值,如果沒有值,則爲FirstOrDefault()

1

ageEntry當前是IEnumerable<string>類型。您可能需要做一些事情,如:

var ageEntry = args.Single(x => x.Key == "Age"); 
var age = Int16.Parse(ageEntry.Value); 
1

LINQ WhereSelect語句總是返回集合。幾乎所有的LINQ操作符都返回集合;有時收集可能有零或一個項目,但它是一個集合,你必須作爲一個集合進行操作。

唯一的例外是

  • Single
  • SingleOrDefault
  • First
  • FirstOrDefault

只要你有一個LINQ查詢並希望將其解析爲一個元素,而不是一個集合你可以使用這些操作符之一,或索引運營商如list[0]

+0

謝謝 - 你說得很清楚 –