Создание метода для использования одного foreach вместо нескольких - PullRequest
0 голосов
/ 07 декабря 2018

Я работаю с c #, и у меня есть рабочий код, где я повторял один и тот же код каждую строку, и это потому, что я создаю список, преобразования, извлекаю данные и т. Д.

Итак, у меня есть несколько foreach пункты, несколько lists, несколько преобразований list в datatables.Мой вопрос заключается в том, что я могу сделать, чтобы повторно факторизовать это, чтобы получить чистый код?

Код:

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);
}

Ответы [ 6 ]

0 голосов
/ 07 декабря 2018

Создать метод (может быть локальный метод?)

DataTable CheckedToDataTable(YourContainerType container)
     => ToStringDataTable(container.CheckBoxItems.Where(x => x.Checked).Select(x => x.Text).ToList());
0 голосов
/ 07 декабря 2018

Приведенный ниже код не совсем верен, но я бы порекомендовал вам создать один универсальный метод, который возвращает DataTable, и вызывать этот метод снова и снова.Как то так:

    public DataTable getDataTable( CheckBox yourCheckBox)
    {
        DataTable returnTable = new DataTable();

        List<string> tempList = new List<string>();

        var checkedDesignStatus = yourCheckBox.CheckBoxItems.Where(x => x.Checked);

        foreach (var i in checkedDesignStatus)
        {
            tempList.Add(i.Text);
        }

        returnTable = ToStringDataTable(tempList);

        return returnTable;
    }
0 голосов
/ 07 декабря 2018

Измените ToStringDataTable на метод расширения .Тогда:

var designStatusParameters = cboDesignStatus.CheckBoxItems.Where(x => x.Checked)
    .Select(i => i.Text).ToList().ToStringDataTable();

Вы даже можете написать метод расширения для своего элемента управления таким способом, который выполняет фильтрацию, проекцию и преобразование в таблицу данных для вас, тогда вы можете иметь:

var designStatusParameters = cboDesignStatus.ToStringDataTable();
0 голосов
/ 07 декабря 2018

Вы предпринимаете ненужные точные шаги, делающие ваш код более многословным, чем это должно быть.

Вы делаете в отдельных шагах:

  1. Создайте пустой список.
  2. Фильтр данных
  3. Итерирование отфильтрованных данных и добавление их в пустой список.

Когда вы можете сделать:

var newList = 
 someCollection.Where(someFilter)
               .Select(someProjection)
               .ToList();

Это сделает кодгораздо более читабельный.

И, если у вас настроение, вы даже можете создать вспомогательный метод, в котором вы передаете someCollection, someFilter и someProjection и возвращаете список чего-либо.

0 голосов
/ 07 декабря 2018

Вам не нужно столько foreach, а просто перефакторинг для одного метода, такого как

public void AddToList(List<string> listToAdd, List<CheckBox> listToIterate)
{
  foreach (var i in listToIterate)
  {
    listToAdd.Add(i.Text);
  }
}
0 голосов
/ 07 декабря 2018

Вы можете вырезать все петли foreach, используя Linq's Select():

Например:

var DesignStatusList =
    cboDesignStatus.CheckBoxItems
        .Where(x => x.Checked)
        .Select(i => i.Text)
        .ToList();

Это оставит вас сList<string> содержит все свойства Text из отмеченных флажков.

Вы можете даже пропустить объявление списка и объединить его с вашими строками DataTable:

var designStatusParameters = ToStringDataTable(
    cboDesignStatus.CheckBoxItems
                .Where(x => x.Checked)
                .Select(i => i.Text)
                .ToList());

Я быпредложите поместить это в собственный метод, а не повторять это снова и снова для каждой группы флажков.

Просто имейте в виду, что меньшее количество строк кода не означает более высокую производительность.По-прежнему приходится перебирать списки, чтобы найти правильные значения.Но это гораздо удобнее для чтения, чем удар по лицу стеной повторяющегося кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...