将foreach循环中发生的条件作为参数传递

时间:2015-09-02 21:53:21

标签: c#

我有一种方法可以将列表中某些学生对象的数据添加到数据表中。该方法检查studentList中满足特定条件的学生,然后将它们添加到数据表中。

我想在参数中指定条件,但是当我尝试传入 s.status 作为我的第二个字符串参数时,我(理解上)会出错,因为 s 在foreach循环开始之前不会发挥作用。有没有办法让这项工作?

    public void AddDataTableRows(DataTable datatable, string field, string condition)
    {
       foreach (student s in studentList)
       {
           if (field == condition)
           {
               datatable.Rows.Add(s.name, 
                   s.totalDays, 
                   s.improveOverall,
                   s.totalClassDays,
                   s.instructor,
                   s.grade);
           }

       }
   }

我想要的电话

AddDataTableRows(DataTable1, s.status, "active");

3 个答案:

答案 0 :(得分:6)

可能是这样的

public void AddDataTableRows(DataTable datatable, Func<Student,bool> cond)
{
    foreach (student s in studentList)
    {
        if (cond(s))
        {
            datatable.Rows.Add(s.name,
                s.totalDays,
                s.improveOverall,
                s.totalClassDays,
                s.instructor,
                s.grade);
        }

    }
}

您现在可以将其称为AddDataTableRows(...., s => s.Status == "active");

答案 1 :(得分:3)

您可以将参数设为Predicate<Student>。这使得函数:

public void AddDataTableRows(DataTable datatable, Predicate<Student> condition)
{
    foreach (student s in studentList.Where(condition))
    {
        datatable.Rows.Add(s.name,
                           s.totalDays,
                           s.improveOverall,
                           s.totalClassDays,
                           s.instructor,
                           s.grade);
    }
}

然后你会这样打电话:

AddDataTableRows(table, (s) => s.status == "active");

答案 2 :(得分:2)

你需要的是:

public void AddDataTableRows(DataTable datatable, Func<student, bool> predicate)
{
    foreach (student s in studentList)
    {
        if (predicate(s))
        {
            datatable.Rows.Add(s.name,
                s.totalDays,
                s.improveOverall,
                s.totalClassDays,
                s.instructor,
                s.grade);
        }

    }
}

你会这样称呼:

AddDataTableRows(datatable, s => s.Status == "enrolled");