【问题标题】:Cast object type in a LINQ statement在 LINQ 语句中转换对象类型
【发布时间】:2014-08-01 09:10:18
【问题描述】:

我有一个 Layer 集合,其中包含一个 Content 对象作为属性。如何将此Content 转换为其原始对象以在 LINQ 语句中获取其属性?

例如:

var item = Layers.FirstOfDefault(x =>(PushPin)x.Content.Description == "xyz");

在这种情况下ContentPushPin 对象类型,我想将其Description 属性与xyz 进行比较

【问题讨论】:

    标签: c# linq collections


    【解决方案1】:

    如果内容可以是 PushPin 以外的其他内容,那么您将需要类似于以下内容的内容

    var item = Layers.FirstOrDefault(x => x.Content is PushPin && ((PushPin)x.Content).Description == "xyz");
    

    【讨论】:

    • 在我看来,这是一个更完整的示例,因为它可以防止由于不正确的演员阵容而发生异常。
    【解决方案2】:

    如果图层中的所有内容对象都是 PushPin 对象,这对你来说应该没问题:

    var item = Layers.Select(x => x.Content).Cast<PushPin>().FirstOrDefault(x => x.Description == "xyz");
    

    但是,如果图层中有无法转换为 PushPin 的对象,则会抛出 InvalidCastException。如果 Layers 包含不同的对象类型但您只需要 PushPins,OfType 应该可以工作:

    var item = Layers.Select(x => x.Content).OfType<PushPin>().FirstOrDefault(x => x.Description == "xyz");
    

    【讨论】:

      【解决方案3】:

      用括号括起来

      var item = Layers.FirstOfDefault(x => ((PushPin)x.Content).Description == "xyz");
      

      【讨论】:

      • 已接受此作为答案,请注意 Content 不是 PushPin 类型的情况,因为代码将引发异常。另外,如果 Content 属性始终是 PushPin 类型,那么我建议将其类型更改为 PushPin 以避免过滤器中的装箱操作。
      【解决方案4】:

      Content 可以是PushPin 以外的其他东西时

      var item = Layers.Select(x => x.Content).OfType<PushPin>().FirstOfDefault(c => c.Description == "xyz");
      

      或者当所有Content 都是PushPin

      var item = Layers.Select(x => x.Content).Cast<PushPin>().FirstOfDefault(c => c.Description == "xyz");
      

      即第一个将过滤PushPin 类型,第二个将所有内容转换为PushPin

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-25
        • 1970-01-01
        相关资源
        最近更新 更多