将LINQ的输出转换为Int16

时间:2011-09-18 16:01:13

标签: c# .net linq

我有以下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'。

这不是我见过的最明显的例外,有人可以向我解释一下吗?

4 个答案:

答案 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 WhereSelect语句始终返回集合。几乎所有LINQ运算符都返回集合;有时集合可能有零个或一个项目,但它是一个集合,你必须作为一个集合进行操作。

例外是

  • Single
  • SingleOrDefault
  • First
  • FirstOrDefault

每当你有LINQ查询并希望将其解析为元素而不是集合时,你可以使用其中一个运算符,或者使用像list[0]这样的索引运算符

答案 3 :(得分:0)

您的输入目前是IEnumerable<string>,但您需要 string值作为输入 - 请尝试以下操作:

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

这假设您的ageEntry枚举实际上只有一个字符串值,否则会抛出异常 - Single()的替代方案取决于您的实际情况First()第一个值,无论枚举中有多少,或者如果没有值,则FirstOrDefault()取第一个值或默认值。