我有以下LINQ表达式:
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'。
这不是我见过的最明显的例外,有人可以向我解释一下吗?
答案 0 :(得分: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
的原因。你说的是“给我一个查询的结果,这个结果来自于完成所有过滤和投射,你知道该怎么做(顺便说一下,如果没有一个结果就抛出异常)。”
答案 1 :(得分:1)
ageEntry
目前的类型为IEnumerable<string>
。您可能想要执行以下操作:
var ageEntry = args.Single(x => x.Key == "Age");
var age = Int16.Parse(ageEntry.Value);
答案 2 :(得分:1)
LINQ Where
和Select
语句始终返回集合。几乎所有LINQ运算符都返回集合;有时集合可能有零个或一个项目,但它是一个集合,你必须作为一个集合进行操作。
例外是
Single
SingleOrDefault
First
FirstOrDefault
每当你有LINQ查询并希望将其解析为元素而不是集合时,你可以使用其中一个运算符,或者使用像list[0]
这样的索引运算符
答案 3 :(得分:0)
您的输入目前是IEnumerable<string>
,但您需要单 string
值作为输入 - 请尝试以下操作:
Int16 age = Convert.ToInt16(ageEntry.Single());
这假设您的ageEntry
枚举实际上只有一个字符串值,否则会抛出异常 - Single()
的替代方案取决于您的实际情况First()
第一个值,无论枚举中有多少,或者如果没有值,则FirstOrDefault()
取第一个值或默认值。