2011-09-18 82 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

谢谢 - 你说得很清楚 –