Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# .NET

Войти
Регистрация
Восстановить пароль
 
 
КВА696
37 / 37 / 6
Регистрация: 20.04.2014
Сообщений: 632
Завершенные тесты: 2
#1

.NET 4.x По компактнее написать код - C#

30.06.2015, 18:05. Просмотров 593. Ответов 24
Метки нет (Все метки)

Возможно ли както компакнее написать код и ускорить его. Просто уверен что написано коряво хотел со switch написать но ему нужны конкретные значения а не переменные а я увы обойтись без переменных не могу


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
        public double НормаРасхода
        {
            get
            {
                if (_ВыбранныйВид == Интерфейс.B6 || (_ВыбранныйВид == "Пруток" && (ВидемостьФормыСечения== "Visible" && ФормаСечения=="КР") || ВидемостьФормыСечения == "Collapsed"))
                {
                    return Круг();
                }
                else if (_ВыбранныйВид == Интерфейс.B7)
                {
                    return Лист();
                }
                else if (_ВыбранныйВид == Интерфейс.B8)
                {
                    return ТрубаКруглая();
                }
                else if (_ВыбранныйВид == Интерфейс.B9)
                {
                    return ТрубаПрямоугольнаяКвадратная();
                }
                else if (_ВыбранныйВид == Интерфейс.B11 && Толщина != 0 && Длинна != 0 && Ширина != 0 && КоэфОтходов != 0)
                {
                    return ЛентаСинтетическая();
                }
                else { return 0; }
            }
        }
 
        double Круг()
        {
            if (ВыбраннаяПлотность != 0 && Диаметр != 0 && Длинна != 0 && КоэфОтходов != 0)
            {
                return Math.Round(((Math.PI * ((Диаметр / 2) / 100) * ((Диаметр / 2) / 100) * (Длинна / 100)) * ВыбраннаяПлотность * КоэфОтходов), 3); //Круг
            }
            else return 0;
        }
        double Лист()
        {
            if (ВыбраннаяПлотность != 0 && Толщина != 0 && Длинна != 0 && Ширина != 0 && КоэфОтходов != 0)
            {
                return Math.Round(((Толщина / 100) * (Длинна / 100) * (Ширина / 100) * ВыбраннаяПлотность * КоэфОтходов), 3);//Лист
            }
            else return 0;
        }
 
        double ТрубаКруглая()
        {
            if (ВыбраннаяПлотность != 0 && Толщина != 0 && Длинна != 0 && Ширина != 0 && Высота != 0 && КоэфОтходов != 0)
            {
                return Math.Round(((((Толщина / 100) * ((Высота * 2 + Ширина * 2) / 100) * (Длинна / 100)) * ВыбраннаяПлотность) * КоэфОтходов), 3);
            }
            else return 0;
        }
 
        double ТрубаПрямоугольнаяКвадратная()
        {
            if (ВыбраннаяПлотность != 0 && Диаметр != 0 && Длинна != 0 && Толщина != 0 && КоэфОтходов != 0)
            {
                var refdi = ((Math.PI * ((Диаметр / 2) / 100) * ((Диаметр / 2) / 100) * (Длинна / 100)) * ВыбраннаяПлотность * КоэфОтходов);
                var refdi1 = ((Math.PI * (((Диаметр - (Толщина * 2)) / 2) / 100) * (((Диаметр - (Толщина * 2)) / 2) / 100) * (Длинна / 100)) * ВыбраннаяПлотность * КоэфОтходов);
                return Math.Round((refdi - refdi1), 3);
            }
            else return 0;
        }
 
        double ЛентаСинтетическая()
        {
            if (ВыбраннаяПлотность != 0 && Диаметр != 0 && Длинна != 0 && Толщина != 0 && КоэфОтходов != 0)
            {
                return КоэфОтходов * (Длинна / 1000);
            }
            else return 0;
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2015, 18:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос .NET 4.x По компактнее написать код (C#):

Как написать оптимизированный код - C#
Интересует вопрос, можно ли реализовать модификацию кода после его отработки, например, в цикле, после какой-то проверки мне уже она будет...

помогите написать код PHP на C# - C#
есть код php по загрузке файлов с ************ $data = array( 'login' => 'kirmanova', 'password' => 'gcUhKnyq' ...

Как написать код для рисования снеговика? - C#
Здравствуйте друзья! Как написать код для рисования снеговика. Реализрвать как процедуру. Количество снеговиков вводит пользователь....

Крестики-нолики. Не могу написать код проверки выигрыша - C#
Задача состояла в том, чтобы написать игру крестики-нолики с использованием массивов. Написала все. Застряла на функции проверки выигрыша....

Написать код для снятия веса с весов Mettler Toledo или Tenso-M - C#
Есть такой код: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using...

Как правильно написать код в рамках ООП (C# + ADO.NET) - C#
Добрый день. Перешел в Delphi на C# стараюсь изменить свое мышление, что-бы писать в рамках ООП, но не всегда получается. Вот чувствую...

24
Storm23
Эксперт .NETАвтор FAQ
5424 / 3281 / 1001
Регистрация: 11.01.2015
Сообщений: 4,363
Записей в блоге: 27
01.07.2015, 10:06 #16
Цитата Сообщение от КВА696 Посмотреть сообщение
Но все равно придется сделать проверку чтобы они небыли равны null.
Ширина не может быть равна null, это промахи вашей типизации. Сделайте их нессылочного типа (double или float) и тогда они в принципе не могут быть равны null.
0
КВА696
37 / 37 / 6
Регистрация: 20.04.2014
Сообщений: 632
Завершенные тесты: 2
01.07.2015, 10:16  [ТС] #17
Цитата Сообщение от Storm23 Посмотреть сообщение
Ширина не может быть равна null
У меня плотность выберается из комбокса и там либо выбрать либо написать а для этого в строчку

XML
1
<ComboBox IsTextSearchEnabled="False" Text="{Binding  Path=ВыбраннаяПлотность, Source={StaticResource Material}}"
ВыбраннаяПлотность должна быть string иначе запятая или точка просто исчезает почему то если делать доубле
0
insite2012
Модератор
Эксперт .NET
4536 / 3488 / 841
Регистрация: 12.10.2013
Сообщений: 10,280
Записей в блоге: 2
01.07.2015, 10:26 #18
Цитата Сообщение от aquaMakc Посмотреть сообщение
Я не могу сходу придумать, как из словаря по ключу вызывать метод.
А в чем проблема? Ключом в словаре ставим что надо, а значением - делегат (типа Action<T> или Func<T>) и вызываем его когда надо.
0
Storm23
Эксперт .NETАвтор FAQ
5424 / 3281 / 1001
Регистрация: 11.01.2015
Сообщений: 4,363
Записей в блоге: 27
01.07.2015, 10:33 #19
Цитата Сообщение от КВА696 Посмотреть сообщение
У меня плотность выберается из комбокса и там либо выбрать либо написать а для этого в строчку
Это все проблемы интерфейса, в расчетную часть должны поступать корректные данные. Точка.
0
JohnJ
108 / 7 / 2
Регистрация: 29.06.2012
Сообщений: 28
02.07.2015, 11:20 #20
Я предлагаю воспользоваться преимуществами ООП.
Писанины меньше не станет, наверное, зато всё будет выглядеть слаженно, компактно и по существу.
У меня получилось так, что основное свойство ваше выглядит так:
C#
1
2
3
4
5
6
7
   public double НормаРасхода {
            get {
                if (ТекущийВидИнтерфейса == null) return 0;
                var результат = ТекущийВидИнтерфейса.Рассчёт();
                return Math.Round(результат, 3);
            }
        }
Уверен, что более опытные разработчики смогут предложить как ещё улучшить.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
    public enum НаборФормСечения {
        Круг, Квадрат, Прямоугольник
    }
 
    public class Круг : ВидИнтерфейса {
        public override double Рассчёт() {
            var д = СДиаметр / 2;
            return Math.PI * д * д * СДлина * Отходы;
        }
    }
 
    public class Пруток : ВидИнтерфейса {
        public НаборФормСечения ФормаСечения = НаборФормСечения.Круг;
 
        public override double Рассчёт() {
            switch (ФормаСечения) {
                case НаборФормСечения.Круг:
                    return (new Круг()).Рассчёт();
                 //....
            }
            return base.Рассчёт();
        }
    }
 
    public class Лист : ВидИнтерфейса {
        public override double Рассчёт() {
            return СТолщина * СДлина * СШирина * Отходы;
        }
    }
 
    public class ТрубаКруглая: ВидИнтерфейса {
        public override double Рассчёт() {
            return СТолщина * 2 * (СВысота + СШирина) * СДлина * Отходы;
        }
 
        public override string ToString() {
            return "Труба круглая";
        }
    }
 
    public class ТрубаПрямоугольнаяКвадратная: ВидИнтерфейса {
        public override double Рассчёт() {
            var д = СДиаметр / 2;
            var дт = д - СТолщина;
            return Math.PI * (д * д - дт * дт) * СДлина * Отходы;
        }
 
        public override string ToString() {
            return "Труба прямоуг./квадр.";
        }
    }
 
    public class ЛентаСинтетическая: ВидИнтерфейса {
        public override double Рассчёт() {
            return Длина / 1000 * КоэфОтходов;
        }
 
        public override string ToString() {
            return "Лента синтетика";
        }
    }
 
   public abstract class ВидИнтерфейса {
        public static double Толщина;
        public static double Диаметр;
        public static double Длина;
        public static double Высота;
        public static double Ширина;
        public static double Плотность;
        public static double КоэфОтходов;
 
        protected double СТолщина {
            get { return Толщина / 100; }
        }
        protected double СДиаметр {
            get { return Диаметр / 100; }
        }
        protected double СДлина {
            get { return Длина / 100; }
        }
        protected double СШирина {
            get { return Ширина / 100; }
        }
        protected double СВысота {
            get { return Высота / 100; }
        }
        protected double Отходы {
            get { return Плотность * КоэфОтходов; }
        }
 
        public abstract double Рассчёт();
 
        public override string ToString() {
            return GetType().Name;
        }
    }
Конечно, лучше каждый класс оформить в виде отдельного файла. А на форме можно будет так использовать:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
public partial class Form1 : Form {
        public ВидИнтерфейса ТекущийВидИнтерфейса {
            get { return cbВидИнтерфейса.SelectedItem as ВидИнтерфейса; }
        }
 
        public ВидИнтерфейса[] ВидыИнтерфейса;
 
        public double Толщина {
            get { return ВидИнтерфейса.Толщина; }
            set { ВидИнтерфейса.Толщина = value; }
        }
 
        public double Диаметр {
            get { return ВидИнтерфейса.Диаметр; }
            set { ВидИнтерфейса.Диаметр = value; }
        }
 
        public double Длина {
            get { return ВидИнтерфейса.Длина; }
            set { ВидИнтерфейса.Длина = value; }
        }
 
        public double Ширина {
            get { return ВидИнтерфейса.Ширина; }
            set { ВидИнтерфейса.Ширина = value; }
        }
 
        public double Высота {
            get { return ВидИнтерфейса.Высота; }
            set { ВидИнтерфейса.Высота = value; }
        }
        
        public double ВыбраннаяПлотность {
            get { return ВидИнтерфейса.Плотность; }
            set { ВидИнтерфейса.Плотность = value; }
        }
 
        public double КоэфОтходов {
            get { return ВидИнтерфейса.КоэфОтходов; }
            set { ВидИнтерфейса.КоэфОтходов = value; }
        }
        
        public Form1() {
            InitializeComponent();
 
            ВидыИнтерфейса = new ВидИнтерфейса[] {
                new Круг(),
                new Пруток(),
                new Лист(),
                new ТрубаКруглая(),
                new ТрубаПрямоугольнаяКвадратная(),
                new ЛентаСинтетическая(),
            };
        }
 
        public double НормаРасхода {
            get {
                if (ТекущийВидИнтерфейса == null) return 0;
                var результат = ТекущийВидИнтерфейса.Рассчёт();
                return Math.Round(результат, 3);
            }
        }
 
        private void Form1_Load(object sender, EventArgs e) {
            cbВидИнтерфейса.Items.AddRange(ВидыИнтерфейса);
            cbФормаСечения.Items.AddRange(new object[] {НаборФормСечения.Круг, НаборФормСечения.Квадрат, НаборФормСечения.Прямоугольник});
            cbВидИнтерфейса.SelectedIndex = 0;
            ПривязатьПоля();
        }
 
        private void ПривязатьПоля() {
            var привязки = new[] {"Высота", "Ширина", "Длина", "Толщина", "Диаметр", "КоэфОтходов", "ВыбраннаяПлотность"};
 
            foreach (var привязка in привязки) {
                var nud = (Controls.Find("nud" + привязка, true)[0] as NumericUpDown);
                nud.DataBindings.Add("Value", this, привязка, false, DataSourceUpdateMode.OnPropertyChanged);
                nud.Value = Convert.ToDecimal(GetType().GetProperty(привязка).GetValue(this));
            }
 
        }
 
        private void bОбновить_Click(object sender, EventArgs e) {
            tbРезультат.Text = НормаРасхода.ToString("0.000");
        }
 
        private void cbФормаСечения_SelectedIndexChanged(object sender, EventArgs e) {
            var пруток = ТекущийВидИнтерфейса as Пруток;
            if (пруток == null || cbФормаСечения.SelectedItem == null) return;
            пруток.ФормаСечения = (НаборФормСечения) cbФормаСечения.SelectedItem;
        }
 
        private void cbВидИнтерфейса_SelectedIndexChanged(object sender, EventArgs e) {
            labelФормаСечения.Visible = cbФормаСечения.Visible = ТекущийВидИнтерфейса is Пруток;
        }
    }
Добавлено через 28 минут
Но ещё есть куда улучшать. Например, размерные свойства, отражающие статические данные, из формы можно перевести в абстрактный класс "ВидИнтерфейса" и к ним же делать привязку элементов формы. Тогда форма очистится от ненужного дублирования расчётных свойств объектов.
1
Psilon
Master of Orion
Эксперт .NET
5909 / 4806 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 5
Завершенные тесты: 4
02.07.2015, 14:15 #21
insite2012, словарь и switch полностью эквивалентны, если только словарь не заполняется в цикле. Да о чем говорить, внутреннее устройство свитча при количестве ветвей больше 3 - словарь
0
КВА696
37 / 37 / 6
Регистрация: 20.04.2014
Сообщений: 632
Завершенные тесты: 2
02.07.2015, 14:49  [ТС] #22
JohnJ, Огромно спс что не прошли мимо.

Цитата Сообщение от JohnJ Посмотреть сообщение
Писанины меньше не станет,
Тут не то слово меньше тут она в 3 раза увеличилась))) и даже с первого взгляда не особо понял как оно работает буду вечером вникать. Огромное спс за пример
0
JohnJ
108 / 7 / 2
Регистрация: 29.06.2012
Сообщений: 28
02.07.2015, 15:32 #23
Увеличилась то не много. Я просто в конце ещё код формы выложил. А вы не выкладывали. Но если учесть, что всё разбито по файлам, то выглядит всё гораздо более прилично, чем у вас. Могу выложить, кстати, пример работы. Так легче разобраться будет, будет возможность воспользоваться отладчиком.
WindowsFormsApplication1.zip
1
КВА696
37 / 37 / 6
Регистрация: 20.04.2014
Сообщений: 632
Завершенные тесты: 2
02.07.2015, 20:53  [ТС] #24
JohnJ, А для чего
C#
1
2
3
        public override string ToString() {
            return "Лента синтетика";
        }
на него же ни кто не ссылается или я что то упустил?

И по статике на сколько я думал им надо максимально реже пользоваться или я ошибаюсь сильно по статическим значениям?
0
JohnJ
108 / 7 / 2
Регистрация: 29.06.2012
Сообщений: 28
03.07.2015, 16:01 #25
А для чего
Это что бы в компоненте на форме, например в ComboBox можно было записать в Items сам объект, а он выглядел как строка.

Статические свойства здесь нужны для того, что бы у всех объектов были общие свойства. На мой взгляд, ими нужно пользоваться когда это удобно. Они предназначены как раз для хранения общих между всеми объектами значений. А их дублирование в самих объектах нужно для того, что бы воспользоваться привязкой BindingData к элементам формы. Может можно было и проще сделать это, но я не умею .
0
03.07.2015, 16:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2015, 16:01
Привет! Вот еще темы с ответами:

Как компактнее записать код - VBA
Как можно записать этот код с наименьшим количеством строк ? Sub Итог_1_0_1() = = = = = = =...

Сделать код компактнее и при этом понятно - C#
public static void symbols(string text,string text2,string special) { int a = new int; a =...

Задача про кирпич - как можно написать компактнее программу, чтобы она работала? - VBA
Sub Кирпич() a = InputBox(&quot;Ширина кирпича a&quot;) b = InputBox(&quot; Высота кирпича b&quot;) c = InputBox(&quot; Длина кирпича c&quot;) x = InputBox(&quot;...

Компактнее уже никак? - C++
Привет, пишу шаблон для безопасного ввода переменных. Потому что, если простым cin вводить, скажем, int, и вместо цифр вы введете буквы или...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru