【问题标题】:Convert output of LINQ to Int16将 LINQ 的输出转换为 Int16
【发布时间】:2011-09-19 08:20:18
【问题描述】:

我有以下 LINQ 表达式:

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

//I want age as Int16:
Int16 age = Convert.ToInt16(ageEntry); 

但是我得到以下异常:

无法转换类型的对象 'WhereSelectEnumerableIterator2[System.Collections.Generic.KeyValuePair2[System.String,System.String],System.String]' 输入“System.IConvertible”。

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

【问题讨论】:

    标签: c# .net linq


    【解决方案1】:

    首先,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。您是说“给我一个查询结果,该结果是您知道如何进行所有过滤和投影的结果(顺便说一下,如果没有一个结果,则抛出异常)。”

    【讨论】:

      【解决方案2】:

      ageEntry 当前是IEnumerable<string> 类型。您可能想要执行以下操作:

      var ageEntry = args.Single(x => x.Key == "Age");
      var age = Int16.Parse(ageEntry.Value);
      

      【讨论】:

        【解决方案3】:

        LINQ WhereSelect 语句总是返回集合。几乎所有 LINQ 运算符都返回集合;有时集合可能有零个或一个项目,但它是一个集合,您必须将其作为一个集合来操作。

        例外是

        • Single
        • SingleOrDefault
        • First
        • FirstOrDefault

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

        【讨论】:

          【解决方案4】:

          您的输入当前是一个IEnumerable<string>,但您需要一个单个 string 值作为输入 - 试试这个:

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

          这假设您的 ageEntry 枚举中实际上只有一个字符串值,否则它将引发异常 - 根据您的实际情况,Single() 的替代方案是 First(),无论如何取第一个值许多都在枚举中或FirstOrDefault() 中,如果没有值,则取第一个或默认值。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-07-09
            • 2016-11-14
            • 2015-03-14
            • 1970-01-01
            • 1970-01-01
            • 2019-06-26
            • 1970-01-01
            相关资源
            最近更新 更多