C# 将LINQ的输出转换为Int16
我得到了以下LINQ表达式:C# 将LINQ的输出转换为Int16,c#,.net,linq,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); 但是,我得到以下例外情况: 无法强制转换类型为的对象 '其中Selec
var ageEntry = from entry in args
where (entry.Key == "Age")
select entry.Value;
//I want age as Int16:
Int16 age = Convert.ToInt16(ageEntry);
但是,我得到以下例外情况:
无法强制转换类型为的对象
'其中SelectEnumerableIterator2[System.Collections.Generic.KeyValuePair
2[System.String,System.String],System.String]'
输入“System.IConvertible”
这不是我见过的最明显的例外,有人能给我解释一下吗?您的输入当前是一个
IEnumerable
,但您需要一个字符串作为输入值-尝试以下方法:
Int16 age = Convert.ToInt16(ageEntry.Single());
这就假设在ageEntry
枚举中实际上只有一个字符串值,否则它将抛出一个异常-根据实际情况,Single()
的备选方案是First()
取第一个值,而不管枚举中有多少个值或FirstOrDefault()
如果没有值,则获取第一个值或默认值。您的输入当前是一个IEnumerable
但您需要一个字符串作为输入值-尝试以下操作:
Int16 age = Convert.ToInt16(ageEntry.Single());
这就假设在ageEntry
枚举中实际上只有一个字符串值,否则它将抛出一个异常-根据实际情况,Single()
的备选方案是First()
取第一个值,而不管枚举中有多少个值或FirstOrDefault()
获取第一个值或默认值(如果没有值)。首先,ageEntry
是一个序列,是查询的结果。看起来您希望查询只有一个结果。因此,你可以说:
short age = Convert.ToInt16(ageEntry.Single());
这不是我见过的最明显的例外,有人能给我解释一下吗
事实上,这很清楚。它告诉您,ageEntry
的类型是WhereSelectEnumerableIterator2[System.Collections.Generic.KeyValuePair2[System.String,System.String],System.String]
,并且它无法转换它。这是您的主要线索,即ageEntry
不是表示一个数字或可以转换为您认为应该是的数字的东西
相反,它表示一个过滤和投影特定序列的查询(在您的示例中是,args
)。基本上,ageEntry
知道如何过滤KeyValuePair
序列并投影到string
。这就是为什么必须使用Enumerable.Single
。你说的是“给我一个查询的结果,这个结果是你知道如何进行过滤和投影的结果(顺便说一句,如果没有一个结果,则抛出一个异常)。”首先,ageEntry
是一个序列,是查询的结果。看起来您希望查询只有一个结果。因此,你可以说:
short age = Convert.ToInt16(ageEntry.Single());
这不是我见过的最明显的例外,有人能给我解释一下吗
事实上,这很清楚。它告诉您,ageEntry
的类型是WhereSelectEnumerableIterator2[System.Collections.Generic.KeyValuePair2[System.String,System.String],System.String]
,并且它无法转换它。这是您的主要线索,即ageEntry
不是表示一个数字或可以转换为您认为应该是的数字的东西
相反,它表示一个过滤和投影特定序列的查询(在您的示例中是,args
)。基本上,ageEntry
知道如何过滤KeyValuePair
序列并投影到string
。这就是为什么必须使用Enumerable.Single
。你说的是“给我一个查询结果,该结果是你知道如何进行过滤和投影的结果(顺便说一句,如果没有一个结果,则抛出一个异常)。ageEntry
当前的类型是IEnumerable
。您可能需要执行以下操作:
var ageEntry = args.Single(x => x.Key == "Age");
var age = Int16.Parse(ageEntry.Value);
ageEntry
当前的类型为IEnumerable
。您可能需要执行以下操作:
var ageEntry = args.Single(x => x.Key == "Age");
var age = Int16.Parse(ageEntry.Value);
LINQWhere
和Select
语句始终返回集合。几乎所有LINQ操作符都返回集合;有时集合可能有零项或一项,但它是一个集合,您必须将其作为集合进行操作
例外情况是
Single
SingleOrDefault
First
FirstOrDefault
每当您有一个LINQ查询并希望将其解析为一个元素而不是一个集合时,您可以使用这些运算符之一,或者像list[0]
LINQ这样的索引运算符,其中和Select
语句始终返回集合。几乎所有LINQ操作符都返回集合;有时集合可能有零项或一项,但它是一个集合,您必须将其作为集合进行操作
例外情况是
Single
SingleOrDefault
First
FirstOrDefault
每当您有一个LINQ查询并希望将其解析为一个元素而不是一个集合时,您都可以使用这些运算符之一,或者像list[0]