创建使用一个foreach而不是多个的方法

Jon*_*han 4 c# winforms

我正在使用c#,我有工作代码,我在每行重复相同的代码,这是因为我正在创建列表,转换,提取数据等.

所以我有多个foreach子句,多个lists,多个转换listdatatables.我的问题是,为了获得干净的代码,我该怎么做才能重新分解这个?

码:

private void BtnLoadReport_Click(object sender, EventArgs e)
{
   var db = new SQLDataMgr();

   List<string> DesignStatusList = new List<string>();
   List<string> ShopStatusList = new List<string>();
   List<string> CustomerTypeList = new List<string>();
   List<string> CustomerList = new List<string>();
   List<string> ResellerList = new List<string>();
   List<string> StateList = new List<string>();
   List<string> ProjectManagerList = new List<string>();
   List<string> SalesRepresentativeList = new List<string>();

   var checkedDesignStatus = cboDesignStatus.CheckBoxItems.Where(x => x.Checked);
   var checkedShopStatus = cboShopStatus.CheckBoxItems.Where(x => x.Checked);
   var checkedCustomerType = cboShopStatus.CheckBoxItems.Where(x => x.Check       
   var checkedCustomer = cboShopStatus.CheckBoxItems.Where(x => x.Checked);
   var checkedReseller = cboShopStatus.CheckBoxItems.Where(x => x.Checked);
   var checkedState = cboShopStatus.CheckBoxItems.Where(x => x.Checked);
   var checkedProjectManager = cboShopStatus.CheckBoxItems.Where(x => x.Checked);
   var checkedSalesRepresentative = cboShopStatus.CheckBoxItems.Where(x => x.Checked);

   foreach (var i in checkedDesignStatus)
   {
      DesignStatusList.Add(i.Text);
   }
   foreach (var i in checkedShopStatus)
   {
      ShopStatusList.Add(i.Text);
   }
   foreach (var i in checkedCustomerType)
   {
      CustomerTypeList.Add(i.Text);
   }
   foreach (var i in checkedCustomer)
   {
      CustomerList.Add(i.Text);
   }
   foreach (var i in checkedReseller)
   {
      ResellerList.Add(i.Text);
   }
   foreach (var i in checkedState)
   {
      StateList.Add(i.Text);
   }
   foreach (var i in checkedProjectManager)
   {
      ProjectManagerList.Add(i.Text);
   }
   foreach (var i in checkedSalesRepresentative)
   {
      SalesRepresentativeList.Add(i.Text);
   }
   DataTable designStatusParameters = ToStringDataTable(DesignStatusList);
   DataTable shopStatusParameters = ToStringDataTable(ShopStatusList);
   DataTable customerTypeParameters = ToStringDataTable(CustomerTypeList);
   DataTable customerParameters = ToStringDataTable(CustomerList);
   DataTable resellerParameters = ToStringDataTable(ResellerList);
   DataTable stateParameters = ToStringDataTable(StateList);
   DataTable projectManagerParameters = ToStringDataTable(ProjectManagerList);
   DataTable salesRepresentativerParameters = ToStringDataTable(SalesRepresentativeList);
}
Run Code Online (Sandbox Code Playgroud)

Rez*_*aei 6

更改ToStringDataTable扩展方法.然后:

var designStatusParameters = cboDesignStatus.CheckBoxItems.Where(x => x.Checked)
    .Select(i => i.Text).ToList().ToStringDataTable();
Run Code Online (Sandbox Code Playgroud)

您甚至可以为您执行过滤,投影和转换为数据表的方式为您的控件编写扩展方法,然后您可以:

var designStatusParameters = cboDesignStatus.ToStringDataTable();
Run Code Online (Sandbox Code Playgroud)


Gab*_*uci 5

您可以foreach使用Linq 来删除所有循环Select():

例如:

var DesignStatusList =
    cboDesignStatus.CheckBoxItems
        .Where(x => x.Checked)
        .Select(i => i.Text)
        .ToList();
Run Code Online (Sandbox Code Playgroud)

这将为您提供List<string>包含Text已检查CheckBoxes 中的所有属性的内容.

您甚至可以跳过声明列表并将其与DataTable创建行组合:

var designStatusParameters = ToStringDataTable(
    cboDesignStatus.CheckBoxItems
                .Where(x => x.Checked)
                .Select(i => i.Text)
                .ToList());
Run Code Online (Sandbox Code Playgroud)

我建议把它放在一个独立的方法中,而不是为每组复选框重复一遍.

请记住,较少的代码行并不意味着更快的性能.它仍然必须遍历列表才能找到正确的值.但它比具有重复代码的墙面更具可读性.