Chefranov
@Chefranov
Новичок

Как сократить условие?

Имеется несколько условий, где проверяется на совпадение одного из нескольких имен + текущая температура
if ((name == "SiO2 (β-кварц)" || name == "SiO2 (α-кварц)" || name == "SiO2 (α-тридимит)" || name == "SiO2 (β-кристобалит)" || name == "SiO2(к) кварц" || name == "SiO2(к) тридимит" || name == "SiO2(к) кристобалит" || name == "SiO2 (полиморф.)") && curTemp <= 846.15)
    {
        h = -217.75F; s = 10F; a = 11.22F; b = 8.2F; c = -2.7F;
    } 
    else if((name == "SiO2 (β-кварц)" || name == "SiO2 (α-кварц)" || name == "SiO2 (α-тридимит)" || name == "SiO2 (β-кристобалит)" || name == "SiO2(к) кварц" || name == "SiO2(к) тридимит" || name == "SiO2(к) кристобалит" || name == "SiO2 (полиморф.)") && curTemp >= 846.15)
    {
        h = -217.6F; s = 0F; a = 14.41F; b = 1.94F; c = 0F;
    }
    else if ((name == "SiO2 (β-кварц)" || name == "SiO2 (α-кварц)" || name == "SiO2 (α-тридимит)" || name == "SiO2 (β-кристобалит)" || name == "SiO2(к) кварц" || name == "SiO2(к) тридимит" || name == "SiO2(к) кристобалит" || name == "SiO2 (полиморф.)") && curTemp >= 1143.15)
    {
        h = -216.5F; s = 10.4F; a = 13.64F; b = 2.64F; c = 0F;
    }
    else if ((name == "SiO2 (β-кварц)" || name == "SiO2 (α-кварц)" || name == "SiO2 (α-тридимит)" || name == "SiO2 (β-кристобалит)" || name == "SiO2(к) кварц" || name == "SiO2(к) тридимит" || name == "SiO2(к) кристобалит" || name == "SiO2 (полиморф.)") && curTemp >= 1743.15)
    {
        h = -215.95F; s = 10.19F; a = 4.28F; b = 21.06F; c = 0F;
    }

Можно ли как-то занести список имен например в массив (или еще как-то) и оттуда брать по одному и сравнивать? А то сейчас выглядит очень громоздко и не читабельно.
  • Вопрос задан
  • 139 просмотров
Решения вопроса 3
ayazer
@ayazer
Sr. Software Engineer
private static string[] _elementNames = new[] { "SiO2 (β-кварц)",  "and", "more"};

....

if (_elementNames.Contains(name))
{
    if (curTemp <= 846.15)
    {
        h = -217.75F; 
        s = 10F;
        a = 11.22F; 
        b = 8.2F; 
        c = -2.7F;
    }
    else if (....) { ....}
    ....
}


если нужно сделать читабельней именно этот кусок - можно сделать как-то так
Ответ написан
Комментировать
fomenkogregory
@fomenkogregory
Юниор софтварный инженер
Не можно, а нужно. :)
А вообще если условие повторяется, лучше вынеси его в переменную и всё.
Создаём массив names = [
"SiO2 (β-кварц)",
"SiO2 (α-кварц)",
"SiO2 (α-тридимит)",
"SiO2 (β-кристобалит)",
"SiO2(к) кварц",
"SiO2(к) тридимит",
"SiO2(к) кристобалит",
"SiO2 (полиморф.)"
]
Дальше можно юзнуть IEnumerable.All (или какой там метод в си# для перебора массива с проверкой условия есть, аналог https://developer.mozilla.org/en-US/docs/Web/JavaS... ?) на нем, результат записать в переменную и подставлять в условия.
Ответ написан
Комментировать
mindtester
@mindtester Куратор тега C#
http://iczin.su/hexagram_48
суммируя идеи (и еще кортежи докинем..)
// подправил для наглядности
using System;
using System.Linq;

namespace SiO2
{
    class Program
    {
        static void Main(string[] args)
        {
            var name = "SiO2 (полиморф.)";
            var curTemp = 846.15;
            var (h, s, a, b, c) = (-1f, -1f, -1f, -1f, -1f);

            var names = new string[]
            {
                "SiO2 (β-кварц)",
                "SiO2 (α-кварц)",
                "SiO2 (α-тридимит)",
                "SiO2 (β-кристобалит)",
                "SiO2(к) кварц",
                "SiO2(к) тридимит",
                "SiO2(к) кристобалит",
                "SiO2 (полиморф.)"
            };

            var values = new (float, float, float, float, float)[]
            {
                (-217.75F, 10.00F, 11.22F,   8.2F, -2.70F),
                (-217.60F,  0.00F, 14.41F,  1.94F,  0.00F),
                (-216.50F, 10.40F, 13.64F,  2.64F,  0.00F),
                (-215.95F, 10.19F,  4.28F, 21.06F,  0.00F)
            };

            if (names.Contains(name))
            {
                if (curTemp <= 846.15)
                    (h, s, a, b, c) = values[0];
                else if (curTemp >= 846.15)
                    (h, s, a, b, c) = values[1];
                else if (curTemp >= 1143.15)
                    (h, s, a, b, c) = values[2];
                else if (curTemp >= 1743.15)
                    (h, s, a, b, c) = values[3];
            }

            Console.WriteLine(h);
            Console.WriteLine(s);
            Console.WriteLine(a);
            Console.WriteLine(b);
            Console.WriteLine(c);
        }
    }
}

при этом глядя на численные величины, у меня сомнение, что возможно их можно и к функциям привести. но это уже вам надо смотреть по условиям задачи
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@d-stream
Готовые решения - не подаю, но...
Напрашивается Dictionary https://docs.microsoft.com/ru-ru/dotnet/api/system...

где ключом будет name, а значением - примитивный класс/структуру из 4 полей

и тогда инициализация словаря вынесется в отдельный блок (и например можно будет его подгружать из хранилища)

а поиск:
h=Dic[""SiO2 (β-кварц)""].h;
s=Dic[""SiO2 (β-кварц)""].s;
...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы