Вы можете использовать Dictionary
вместо switch
заявление.
Для получения более чистого, как вы можете создать интерфейс
public interface IConverter
{
string GetFormattedResult(int value);
}
Затем создать свою собственную реализацию для каждого блока у вас есть
public class CentimeterConverter : IConverter
{
private const double COEFFICENT = 0.3937;
public string GetFormattedResult(int value)
{
var centimeter = input/COEFFICENT ;
return $"In Centimeters: {centimeter}";
}
}
Затем в коде создать словарь с Key - выбор символ и значение - экземпляр конвертеру Внедрение
static void Main(string[] args)
{
var converters = new Dictionary<char, IConverter>
{
{ 'i', new CentimeterConverter() },
{ 'g', new LitersConverter() }
}
WriteLine("Enter the value you wanted to convert: ");
int input = ToInt32(ReadLine());
var choiceText =
"Press Any Of The Given Choices
I->convert from inches to centimeters.
G->convert from gallons to liters.
M->convert from mile to kilometer.
P->convert from pound to kilogram.";
WriteLine(choiceText);
char choice = Char.ToLower(ToChar(ReadLine()));
var converter = converters[choice];
WriteLine(converter.Convert(input));
ReadKey();
}
Для того чтобы сделать ключи немного более читабельными, вы можете использовать статический класс с константами
public static class ConverterKayes
{
public const char InchesToCentimaters = 'i';
public const char GallonsToLiters = 'g';
}
Перечисления являются целыми числами типа, так что вы можете создать перечисление, где имена ключей
public enum Keys
{
I = 1,
G = 2
}
Но это перечисление не дает большую ценность для читаемости кода.
Если вы действительно хотите перечисления, то вы можете использовать DescriptionAttribute
, где вы можете определить ключи в атрибуте
public enum Keys
{
[Description("I")] InchesToCentimeters = 1,
[Description("G")] GallonsToLiters = 2
}
Но вам нужно будет создать некоторый метод для извлечения значения из этого атрибута. То же самое для коэффициентов - это очень просто сохранить их как константы статического класса.
Другой подход может быть KeyedCollection
, он может быть подходящим для вашего случая, потому что у вас есть такие же логики для всех ключей, только значение изменения
public class ConverterToContinentalUnit
{
public char Key { get; set; }
public double Coefficent { get; set; }
public string PrefixForResult { get; set; }
public string GetFormattedResult(int value)
{
var continentalUnit = input/Coefficent;
return $"{PrefixForResult}: {continentalUnit}";
}
}
public class ConverterCollection: KeyedCollection<int, ConverterToContinentalUnit>
{
// This need to be implemented and return key value
protected override int GetKeyForItem(ConverterToContinentalUnit item)
{
return item.Key ;
}
}
затем использовать его
static void Main(string[] args)
{
var converters = new ConverterCollection();
var toCentimeters = new ConverterToContinentalUnit
{
Key = "i",
Coefficent = 0.3937,
PrefixForResult = "In Centimeters"
}
converters.Add(toCentimeters);
WriteLine("Enter the value you wanted to convert: ");
int input = ToInt32(ReadLine());
var choiceText =
"Press Any Of The Given Choices
I->convert from inches to centimeters.
G->convert from gallons to liters.
M->convert from mile to kilometer.
P->convert from pound to kilogram.";
WriteLine(choiceText);
char choice = Char.ToLower(ToChar(ReadLine()));
var converter = converters[choice];
WriteLine(converter.Convert(input));
ReadKey();
}