【问题标题】:C# where and selectC# 在哪里和选择
【发布时间】:2016-02-07 00:59:30
【问题描述】:

有人可以帮忙解释以下代码中发生了什么吗?非常感谢!结果是 meo,但我不明白这两个 'where' 在这种情况下是如何工作的。

public class Cat {
  public string Text { get; set; }
  public Cat Where(Func<Cat,bool> cond) {
    return new Cat {
      Text = cond(this)? this.Text.ToUpper(): this.Text.ToLower()
    }; }
  }
public static class CatExtensions {
    public static T Select<T>(this Cat cat, Func<Cat,T> proj) 
      { 
         return proj(cat);
      } 
 }


var moggy = new Cat { Text = "Meo" }; 
var result = from m in moggy
   where true 
   where false 
   select m.Text;

【问题讨论】:

    标签: c# linq select where func


    【解决方案1】:

    from a in B where E 被认为与B.Where(a =&gt; E) 相同。

    因为类定义了自己的Where 方法,所以使用这些方法而不是Linq 定义的方法,因为实例方法总是在可用时选择扩展方法。这些方法也不适用。

    第一个返回一个全大写的 MEO cat,然后第二个作用于它并返回一个全小写的 meo cat。

    select 是一种扩展方法,并将委托应用于最后一个对象。

    【讨论】:

      【解决方案2】:

      如果你看一下该表达式的方法链语法版本会更容易理解:

      moggy
        .Where(m => true)     // returns new Cat { Text = "MEO" }
        .Where(m => false)    // returns new Cat { Text = "meo" }
        .Select(m => m.Text); // returns "meo"
      

      【讨论】:

      • 第二个 where 子句不会让当前的Cat 通过,对吗?
      • 谢谢!我有点困惑。 Where 是 where 的扩展方法?为什么要使用 Where 来查看表达式,在表达式中使用 where(小写字母) 时?
      • Where 是类Cat 中定义的自定义方法。它不是 .NET 框架中的 Where 方法。
      • @user3735871 如果在 LINQ 表达式中使用 where,它将在接受 Func&lt;ObjectType, bool&gt; 类型参数的对象上查找名为 Where 的方法,如果存在则使用该方法.这就是这里发生的事情。
      • @displayName where 子句都没有通过原始的Cat。每个返回一个新的Cat
      【解决方案3】:

      这些是 LINQ 中的多个 Where 子句。

      通常这就像一个简单的 And 条件

      例如,假设我们有一个客户实体,我们将所有客户存储在一个变量 results 中,我们想要获取名字为 John 且姓氏为 Doe 的客户,那么我们会这样做

      results.Where(x => (x.FirstName == "John") && (x.LasttName == "Doe"));
      

      现在这段代码可以用2个Where子句来写

      results.Where(x => (x.FirstName == "John"))
             .Where(x => (x.LasttName == "Doe"));
      

      【讨论】:

      • 这里不相关或不适用。
      猜你喜欢
      • 1970-01-01
      • 2022-08-18
      • 2013-08-05
      • 1970-01-01
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      相关资源
      最近更新 更多