Сделайте несколько операторов if короткими - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь создать запятую string на основе значения boolean свойств в model.

Код

        string options = string.Empty;

        if (model.Fruits.Value)
        {
            options += "FR,";
        }
        if (model.Drinks.Value)
        {
            options += "DR,";
        }
        if (model.Lunch.Value)
        {
            options += "LU,";
        }
        if (model.Dinner.Value)
        {
            options += "DI,";
        }

Можем ли мы сделать приведенный выше код основанным на сокращениях, используя ternary conditional operator (?:), или я должен просто оставить его выше, как есть, потому что он более читабелен?

Любые предложения будут великолепны.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

небольшое обновление вашего кода.думал, что это может помочь вам ..

using System;
using System.Text;

public class Program
{
public static void Main()
{
       StringBuilder options = new StringBuilder();
    Food model= new Food();


    if (model.Fruits.HasValue)
    {
        options.Append("FR,");
    }
    if (model.Drinks.HasValue)
    {
        options.Append("DR,");
    }
    if (model.Lunch.HasValue)
    {

        options.Append("LU,");
    }
    if (model.Dinner.HasValue)
    {
        options.Append("DI,");
    }
    Console.WriteLine(options);
}
}

public class Food{
public int? Fruits{get;set;}
public int? Drinks{get;set;}
public int? Lunch{get;set;}
public int? Dinner{get;set;}

public Food(){
    Fruits=1;
    Drinks=null;
    Lunch=2;
    Dinner=3;
}

}
0 голосов
/ 12 февраля 2019

У такого подхода могут быть некоторые преимущества, такие как:

    string options = 
        (model.Fruits.Value ? "FR," : "")
        + (model.Drinks.Value ? "DR," : "")
        + (model.Lunch.Value ? "LU," : "")
        + (model.Dinner.Value ? "DI," : "");

В частности, это будет один вызов string.Concat (см. пример здесь - вы ищете одну call string [mscorlib]System.String::Concat(string, string, string, string)), поэтому она позволит избежать большого количества промежуточных строк (+=) в сценарии «все опции».Однако, честно говоря, я бы посоветовал вместо этого использовать [Flags] enum, то есть

[Flags]
enum FoodOptions {
    None = 0,
    Fruits = 1,
    Drinks = 2,
    Lunch = 4,
    Dinner = 8,
}

var options = FoodOptions.None;
if(model.Fruits.Value) options |= FoodOptions.Fruits;
if(model.Drinks.Value) options |= FoodOptions.Drinks;
if(model.Lunch.Value) options |= FoodOptions.Lunch;
if(model.Dinner.Value) options |= FoodOptions.Dinner;

, который во всем является целыми числами.

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