Переписать несколько операторов if - PullRequest
0 голосов
/ 30 апреля 2018

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

    public DataSet getOrganizationDataSet(string organizationType, string 
    name, string state, string city, string county, string zip)
    {
        string search = "";

        if (organizationType != "")
        {
            search = search + "&type=" + organizationType;
        }
        if (name != "")
        {
            search += "&name=" + name;
        }
        if (city != "")
        {
            search = search + "&town=" + city;
        }
        if (zip != "")
        {
            search = search + "&zip=" + zip;
        }
        if (county != "")
        {
            search = search + "&county=" + county;
        }
        if (state != "")
        {
            search = search + "&state=" + state;
        }
}

Я думаю написать такой код, чтобы сделать его более читабельным:

 public DataSet getOrgDataSet(string type, string name, string state, 
 string city, string county, string zip)
    {
        string search = "";

        if ((type ?? state ?? name ?? city ?? county ?? zip) != "") {

            search += "&type=" + type;
            search += "&name=" + name;
            search += "&town=" + city;
            search += "&county=" + county;
            search += "&zip=" + zip;
            search +=  "&state=" + state;

     }

Мне бы хотелось узнать ваше мнение об этом и лучших практиках. Спасибо заранее, и извините за вопрос новичка, я все еще учусь c #

Ответы [ 5 ]

0 голосов
/ 30 апреля 2018

Лучшей практикой будет создание OrganizationFilter модели с использованием метода GetSearchString, который использует частный метод ответа dasblinkenlight:

public class OrganizationFilter
{
    public string OrganizationType { get; set; }
    public string Name { get; set; }
    public string State { get; set; }
    public string City { get; set; }
    public string Country { get; set; } 
    public string Zip { get; set; }

    public string GetSearchString()
}

Затем ваш метод будет переписан так:

public DataSet getOrganizationDataSet(OrganizationFilter filter)
{
    string search = filter.GetSearchString();
    //...
}
0 голосов
/ 30 апреля 2018

Я бы не знал, является ли это лучшей практикой (и вопрос об этом делает ваш вопрос не по теме, кстати), но это то, что я делаю большую часть времени:

string search =
    String
        .Join("", new[]
        {
            new { key= "type", value = organizationType },
            new { key= "name", value = name },
            new { key= "town", value = city },
            new { key= "zip", value = zip },
            new { key= "county", value = county },
            new { key= "state", value = state },
        }
        .Where(x => !String.IsNullOrEmpty(x.value))
        .Select(x => $"&{x.key}={x.value}"));
0 голосов
/ 30 апреля 2018

Сделайте приватный метод в вашем классе:

private string AddProperty(String property, String value)
{
    if (value != "")
    {
        return $"&{propertie}={value}";
    }
    return "";
}

Затем вы можете использовать его так:

public DataSet getOrgDataSet(string type, string name, string state, string city, string county, string zip)
{
    string search = "";

    search += AddProperty("type", type);
    search += AddProperty("name", name);
    search += AddProperty("town", city);
    search += AddProperty("county", county);
    search += AddProperty("zip", zip);
    search += AddProperty("state", state);
 }
0 голосов
/ 30 апреля 2018

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

public DataSet getOrganizationDataSet(params KeyValuePair<string, string>[] filters)
{
    var builder = new StringBuilder();

    foreach (var filter in filters)
    {
        //c# 6 / VS2015+
        builder.Append($"&{filter.Key}={filter.Value}");
        // VS2013 and lower
        builder.AppendFormat("&{0}={1}", filter.Key, filter.Value);
    }

    string search = builder.ToString();
}

Таким образом, если имена фильтров меняются, вам не нужно менять getOrganizationDataSet. Вы можете вызвать этот метод как:

var dataSet = getOrganizationDataSet(
    new KeyValuePair<string, string>("city", city),
    new KeyValuePair<string, string>("type", type),
    // ... etc
);
0 голосов
/ 30 апреля 2018

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

private static void AppendSearch(StringBuilder search, string name, string value) {
    if (!string.IsNullOrEmpty(value)) {
        search.Append($"&{name}={value}");
    }
}

Теперь вы можете вызывать этот метод несколько раз для каждого отдельного элемента, чтобы построить строку поиска:

var search = new StringBuilder();
AppendSearch(search, "name", name);
AppendSearch(search, "town", town);
AppendSearch(search, "zip", zip);
...
var searchString = search.ToString();

Примечание: Реализация использует синтаксис C # 6 для интерполяции строк. Используйте метод AppendFormat, если вы используете более раннюю версию языка:

search.AppendFormat("&{0}={1}", name, value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...