【问题标题】:Learning C# delegates. Passing a filtering function as delegate学习 C# 委托。将过滤函数作为委托传递
【发布时间】:2022-08-24 20:46:37
【问题描述】:

在我的Program.cs

我声明一个代表

public delegate bool FilterDelegate(Employee emp);

我创建了一个员工列表

 List<Employee> employees = new List<Employee>
 {
               new Employee(){ID= 1907, Name= \"Mary Sue\", Experience = 5},
               new Employee(){ID= 1353, Name= \"Peggy Sue\",  Experience = 1},
               new Employee(){ID= 1645, Name= \"Gary Stu\", Experience = 2},
               new Employee(){ID= 141, Name= \"John Doe\", Experience = 3},
               new Employee(){ID= 1033, Name= \"Jimmy Smith\",  Experience = 4}
      };

调用显示函数并传递委托

Employee.FilterAndDisplay(employees, cutOffFilter);


static bool cutOffFilter(Employee emp)
{

    return emp.Experience < 4;
}

Employee.cs

public static void FilterAndDisplay(List <Employee> employees, FilterDelegate filter)
{
    var table = new ConsoleTable(\"ID\", \"Name\", \"Experience\");

    foreach (var emp in employees)
    {
        if(filter(emp))
        {
            table.AddRow(emp.ID, emp.Name, emp.Experience);
        }
       
    }


    table.Write();
    Console.WriteLine(); 
}

现在这工作正常。但是,如果我想让经验年数动态化怎么办?如何将变量传递给 static bool cutOffFilter ?然后在if(filter(emp)) 中使用它?

  • 你确定那工作?委托需要两个参数,但方法cutOffFilter 有一个。
  • 也许只是我的看法,但我发现使用委托类型有点烦人。 Funcs 和Actions 使用起来更容易,也更灵活。
  • @vernou 第二个是一个错误
  • 顺便说一句,Employee 应该只是具有员工属性的类。它根本不应该知道如何过滤或显示员工。所以把那个方法移到别处!
  • @Jamiec 有时在数据库模型中他们没有过滤数据的方法吗?

标签: c# .net delegates


【解决方案1】:

您可以为此使用LambdaExrpessions: 这假设您的代表只有参数。你的例子在那里不清楚。

Employee.FilterAndDisplay(employees, emp => emp.Expirience < 2);

或者

Employee.FilterAndDisplay(employees, emp => 
{
    return emp.Experience < 4;
});

或者

int minExp = 5;
Employee.FilterAndDisplay(employees, emp => emp.Expirience < minExp );

【讨论】:

    【解决方案2】:

    我建议使用 Linq。

    在顶部添加引用以包含 System.Linq 然后使用 Where 而不是您自己的过滤器方法:

    using System.Linq
    

    ...

    foreach (Employee emp in employees.Where(e => e.Experience < 4))
        table.AddRow(emp.ID, emp.Name, emp.Experience);
    

    ...

    因此,您可以将方法更改为:

    public static void FilterAndDisplay(List <Employee> employees, Func<Employee, bool> predecate)
    {
        var table = new ConsoleTable("ID", "Name", "Experience");
    
        foreach (var emp in employees.Where(predecate))
            table.AddRow(emp.ID, emp.Name, emp.Experience);
    
        table.Write();
        Console.WriteLine(); 
    }
    

    ...

    如果您仍然想要带有参数的静态函数:

    static bool CutOffFilter(Employee emp, int maxExp)
    {
        return emp.Experience < maxExp;
    }
    

    并将您的过滤方法称为:

    FilterAndDisplay(employees, e => CutOffFilter(e, 4));
    

    【讨论】:

      猜你喜欢
      • 2011-05-29
      • 1970-01-01
      • 2018-05-07
      • 2015-10-29
      • 2015-03-06
      • 2012-07-12
      • 2015-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多