Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将LINQ的输出转换为Int16_C#_.net_Linq - Fatal编程技术网

C# 将LINQ的输出转换为Int16

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

我得到了以下LINQ表达式:

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

//I want age as Int16:
Int16 age = Convert.ToInt16(ageEntry); 
但是,我得到以下例外情况:

无法强制转换类型为的对象 '其中SelectEnumerableIterator
2[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);

LINQ
Where
Select
语句始终返回集合。几乎所有LINQ操作符都返回集合;有时集合可能有零项或一项,但它是一个集合,您必须将其作为集合进行操作

例外情况是

  • Single
  • SingleOrDefault
  • First
  • FirstOrDefault

每当您有一个LINQ查询并希望将其解析为一个元素而不是一个集合时,您可以使用这些运算符之一,或者像
list[0]
LINQ
这样的索引运算符,其中
Select
语句始终返回集合。几乎所有LINQ操作符都返回集合;有时集合可能有零项或一项,但它是一个集合,您必须将其作为集合进行操作

例外情况是

  • Single
  • SingleOrDefault
  • First
  • FirstOrDefault
每当您有一个LINQ查询并希望将其解析为一个元素而不是一个集合时,您都可以使用这些运算符之一,或者像
list[0]