Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Оптимизация linq запроса

Здравствуйте, есть у нас в отделе принципиальный прожект-менеджер, который любит, чтобы код был оптимизирован только так, как он считает нужным. Собственно дело в том, что у меня linq запросы написаны с использованием объекта ExpandoObject, например:
object obj = db
    .CalculateWebApplicationAvailability(dateFrom, dateTo, item, userID)
    .Select(sel =>
    {
        dynamic expando = new ExpandoObject();
        expando.id = sel.AppID;
        expando.order = sel.Order;
        expando.name = sel.AppName;
        expando.availability = new ExpandoObject();
        expando.availability.code = sel.Code;
        expando.availability.value = sel.AvValue;
        return expando;
    })
    .FirstOrDefault();

именно такого вида запросы позволили мне сократить код дальнейшей обработки объектов внутри запроса, т.к. мне теперь не нужно использовать рефлексию, а работать просто как с IDictionary объектами.
Так вот он говорит, что это не очень правильно и затратно, типа он то будет работать, но нужно писать только вот так:
object obj = slic
    .CalculateWebApplicationAvailability(dateFrom, dateTo, item, userID)
    .Select(sel => new
    {
        id = sel.AppID,
        order = sel.Order,
        name = sel.AppName,
        availability = new 
        {
            code = sel.Code,
            value = sel.AvValue
        }
    })
    .FirstOrDefault();

Т.к наш прожект-менеджер не во всех случаях говорит правильно про оптимизацию (бывает такое), хотелось бы узнать, действительно ли ExpandoObject такой затратный для памяти, времени запроса и т.д.?
Ответ:
автор
прожект-менеджер
и
автор
код
всегда думал что эти где-то в разных измерениях существуют..
Вопрос: Оптимизация скорости кода

Необходимо(дать совет по оптимизации) оптимизировать код, чтоб меньше времени занимало на обработку данных.
Подробнее о задаче можно узнать в прикрепленной пикче ниже:
Код:
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
using System;
 
public class Program
{
    public static void Main(string[] args)
    {
        long i = long.Parse(Console.ReadLine());
        long min = 0;
        long max = 0;
        long count = 1;
        long first = 0;
        long second = 0;
        long result = i;
        if (i <= 6)
        {
            switch (i)
            {
                case 6:
                    min = 1;
                    max = 6 * 6;
                    break;
                case 5:
                    min = 2;
                    max = 5 * 6;
                    break;
                case 4:
                    min = 3;
                    max = 4 * 6;
                    break;
                case 3:
                    min = 4;
                    max = 3 * 6;
                    break;
                case 2:
                    min = 5;
                    max = 2 * 6;
                    break;
                case 1:
                    min = 6;
                    max = 6;
                    break;
            }
            if (i <= 6)
            {
                Console.WriteLine(min + " " + max);
            }
        }
        else if (i % 1 == 0)
        {
            count = 0;
            while (i >= 6)
            {
                i -= 6;
                count++;
            }
            switch (i)
            {
                case 5:
                    first = count + 2;
                    second = result * 6;
                    break;
                case 4:
                    first = count + 3;
                    second = result * 6;
                    break;
                case 3:
                    first = count + 4;
                    second = result * 6;
                    break;
                case 2:
                    first = count + 5;
                    second = result * 6;
                    break;
                case 1:
                    first = count + 6;
                    second = result * 6;
                    break;
                case 0:
                    first = count;
                    second = result * 6;
                    break;
            }
            Console.WriteLine(first + " " + second);
        }
    }
}
Ответ: Ошибка в коде была
Вопрос: Отмена оптимизации участка кода

Доброго времени суток!

Подскажите пожалуйста, какие есть способы полной отмены оптимизации в участке кода в GCC и CLang?
Ответ:
Цитата KILLER @
И зачем вообще такое нужно(просто ради интереса)?


Хочу поиграться с созданием полиморфного кода (исполнение в стеке).
Вопрос: оптимизация php кода

вопрос знающим php, ниже приведен рабочий код, но он очень сильно долго грузится, есть ли возможность его как-то оптимизировать для ускорения загрузки...

на сортировку внимание не обращайте она не работает...

работу скрипта можно увидеть

Код:
<?php
header
("Content-type: text/html; charset=utf-8");
$clan_id '145563'
$appid "demo"
$urlID "http://api.worldoftanks.ru/wgn/clans/info/?application_id=$appid&language=ru&clan_id=".$clan_id//ссылка на json
$curl curl_init();
        
curl_setopt($curlCURLOPT_URL$urlID);
        
curl_setopt($curlCURLOPT_RETURNTRANSFER1);
        
$resultID json_decode(curl_exec($curl), true);

function 
GetRoleWeight($role)
{
switch(
$role)
{
case 
"commander": return 11;
case 
"executive_officer": return 10;
case 
"personnel_officer": return 9;
case 
"combat_officer": return 8;
case 
"intelligence_officer": return 7;
case 
"quartermaster": return 6;
case 
"recruitment_officer": return 5
case 
"junior_officer": return 4;
case 
"private": return 3;
case 
"recruit": return 2;
case 
"reservist": return 1;
default: die(
"Неизвестная роль $role);

}
function 
cmp($a$b)

return 
GetRoleWeight($b["role"])>GetRoleWeight($a["role"]);
}
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ru">
    <head>
        <!-- <meta http-equiv="Content-Type" content="text/html;" charset="windows-1251" /> -->
        <meta charset="windows-1251">
        <link rel="stylesheet" href="http://uadd-clans.tk/css/style.css" type="text/css" media="screen">
        <title>Список клана</title>
 
        <style>
            table.tablesorter {
                font-family:arial;
                background-color: #CDCDCD;
                margin:10px 0pt 15px;
                font-size: 8pt;
                width: 100%;
                text-align: left;
            }
            table.tablesorter thead tr th, table.tablesorter tfoot tr th {
                background-color: #e6EEEE;
                border: 1px solid #FFF;
                font-size: 8pt;
                padding: 4px;
            }
            table.tablesorter thead tr .header {
                background-image: url(bg.gif);
                background-repeat: no-repeat;
                background-position: center right;
                cursor: pointer;
            }
            table.tablesorter tbody td {
                color: #3D3D3D;
                padding: 4px;
                background-color: #FFF;
                vertical-align: top;
            }
            table.tablesorter tbody tr.odd td {
                background-color:#F0F0F6;
            }                              
            table.tablesorter thead tr .headerSortUp {
                background-image: url('data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7');
            }
            table.tablesorter thead tr .headerSortDown {
                background-image: url('data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7');
            }
            table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp {
                background-color: #8dbdd8;
            }
        </style>
        <script type="text/javascript" src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-1.11.2.min.js"></script>
        <script type="text/javascript" src="//cdn.ucb.org.br/Scripts/tablesorter/jquery.tablesorter.min.js"></script>
        <script type="text/javascript">
            $(document).ready(function() {
                // теперь по умолчанию у нас всегда будет запускаться виджет зебра
                $.tablesorter.defaults.widgets = ['zebra'];
                // теперь по умолчанию всегда будем сортировать по первой колонке
                $.tablesorter.defaults.sortList = [[3,1]];
                // вызов плагина
                $("table").tablesorter();
            });   
        </script>
        <style>
            .num {
                font-size: 17px;
                font-weight: bold;
            }
            .op2 {
                font-size: 11pt;
                font-weight: bold;
                color: #ffffff;
            }
        </style>


    </head>
    <body style="margin: 0; padding: 0;">
        <table border="0" cellpadding="0" cellspacing="0" width="840" style="border: 4px solid #3e4156;">
        <tr><td bgcolor="#3E4156" height="23"><span class="op2">СОСТАВ КЛАНА UA_DD</span></td></tr>
        <tr><td>
            <table class="tablesorter" cellspacing="1" style="width: 800px;">   <!-- class="tablesorter" -->          
                <thead>
                    <tr>
                        <th>Имя</th>
                        <th>Кол. боев</th>
                        <th>% побед</th>
                        <th>Рейтинг WG</th>
                        <!-- <th>ID</th> -->
                        <!-- <th>Состоит в клане</th> -->
                        <th>Дней в клане</th>
                        <th>Звание</th>
                    </tr> 
                </thead>
                <tbody> 
                    <?php             
                    
foreach($resultID['data'][$clan_id]['members'] as $key => $val){
                        
$new_time date('Y.m.d',$val['joined_at']);
usort($resultID['data'][$clan_id]['members'], "cmp" );
                        
?> 
                        <tr>
<td><?php echo $val['account_name']; ?></td><!-- игрок -->
<td><!-- кол. игор -->
<?php $account_id $val['account_id'];
$urlstat "http://api.worldoftanks.ru/wot/ratings/accounts/?application_id=$appid&fields=battles_count&type=all&account_id=".$account_id//ссылка на json
$curl curl_init();
        
curl_setopt($curlCURLOPT_URL$urlstat);
        
curl_setopt($curlCURLOPT_RETURNTRANSFER1);
        
$rating_battles json_decode(curl_exec($curl), true);
          foreach(
$rating_battles['data'] as $key => $val_battles);
      echo 
$val_battles['battles_count']['value'];
?></td>
<td><!-- % побед -->
<?php $account_id $val['account_id'];
$urlstattt "http://api.worldoftanks.ru/wot/ratings/accounts/?application_id=$appid&fields=wins_ratio&type=all&account_id=".$account_id//ссылка на json
$curl curl_init();
        
curl_setopt($curlCURLOPT_URL$urlstattt);
        
curl_setopt($curlCURLOPT_RETURNTRANSFER1);
        
$rating_wins json_decode(curl_exec($curl), true);
          foreach(
$rating_wins['data'] as $key => $val_wins);
      echo 
$val_wins['wins_ratio']['value'];
?>%
</td>
<td><!-- глобал. рейтинг -->
<?php $account_id $val['account_id'];
$urlstatt "http://api.worldoftanks.ru/wot/ratings/accounts/?application_id=$appid&fields=global_rating&type=all&account_id=".$account_id;
$curl curl_init();
        
curl_setopt($curlCURLOPT_URL$urlstatt);
        
curl_setopt($curlCURLOPT_RETURNTRANSFER1);
        
$rating_global json_decode(curl_exec($curl), true);
          foreach(
$rating_global['data'] as $key => $val_global);
      echo 
$val_global['global_rating']['value'];
?></td>

                            <!-- <td><?php echo $val['account_id']; ?></td> -->
                            <!-- <td><?php echo $new_time?></td> -->
                            <td><?php echo round((strtotime(date("Y-m-d H:i:s")) - $val['joined_at'])/(3600*24)); ?></td>
                            <td><?php echo $val['role_i18n']; ?></td>
                                                             </tr>
                        <?php ?>
                </tbody> 
            </table>
            <p class="num">Всего игроков: <?php echo $resultID['data'][$clan_id]['members_count'?></p>
            </td>
        </tr>
        </table>
    </body>
</html>

отвечу на все вопросы
Ответ: у меня получилось вот так закодировать, все вроде правильно, но от куда взялись "\" (слешы) - ?
Код:
"[{\"nikname\":\"baron80_80\",\"battles\":22362,\"wins\":51.97,\"global\":7485},{\"nikname\":\"PositiveGame\",\"battles\":17718,\"wins\":58.04,\"global\":8353},{\"nikname\":\"dune2004\",\"battles\":16507,\"wins\":51.08,\"global\":6077},{\"nikname\":\"LionZT\",\"battles\":17608,\"wins\":50.42,\"global\":5483},{\"nikname\":\"streamers\",\"battles\":8776,\"wins\":49.74,\"global\":4609},{\"nikname\":\"Maestro14\",\"battles\":15873,\"wins\":49.74,\"global\":5620},{\"nikname\":\"Daily\",\"battles\":22249,\"wins\":49.27,\"global\":5259},{\"nikname\":\"ADS104\",\"battles\":55300,\"wins\":52.43,\"global\":7278},{\"nikname\":\"Gordey123\",\"battles\":25514,\"wins\":50.16,\"global\":5691}, и т.д.


Код:
$row = array("nikname" => $val['account_name'], "battles" => $val_battles['battles_count']['value'], "wins" => $val_wins['wins_ratio']['value'], "global" => $val_global['global_rating']['value']);
$rows[] = $row;
$d = json_encode($rows);
}
file_put_contents('data1.json', json_encode($d, JSON_FORCE_OBJECT), FILE_APPEND);


соотвецтвенно:
Код:

$homepage 
= file_get_contents('data1.json');    
$json 
= json_decode($homepage, TRUE);
foreach(
$homepage as $val){
echo $val['nikname'];
echo $val['battles'];
echo $val['wins'];
echo $val['global'];
}
echo $homepage;
 

не работает, а вот echo $homepage; выводит весь файл без "\" - ? в чем я опять "плуганул"???
Вопрос: Сокращение, оптимизация, замена кода

Здравствуйте. Столкнулся с проблемой Compile error: Procedure too large.
Помогите сократить код иди дайте другую идею для реализации задуманого.
Задумано так: в открытом документе, в первой попавшей таблице, в каждой строке 4-го столбца выделяется текст ячейки. Делается проверка выделенного текста с заданным текстом, если удовлетворяет - переменной присвоить соответственное значение.
Получается 500 строк If Selection.Execute(FindText:=" ", MatchCase:=True, Wrap:=wdFindStop, MatchWildcards:=True) = True Then переменная = " "
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub project0 ()
Dim obl1, obl2, obl3 As String
For Row = 2 To ActiveDocument.Tables(1).Rows.Count
Selection.Find.ClearFormatting
ActiveDocument.Tables(1).Columns(4).Cells(Row).Select
If Selection.Find.Execute(FindText:="м.*@Ладижин", MatchCase:=True, Wrap:=wdFindStop, MatchWildcards:=True) = True Then oblrow = "02373"
If Selection.Find.Execute(FindText:="м.*@Вінниц", MatchCase:=True, Wrap:=wdFindStop, MatchWildcards:=True) = True Then oblrow = "02383"
If Selection.Find.Execute(FindText:="м.*@Нововолинськ", MatchCase:=True, Wrap:=wdFindStop, MatchWildcards:=True) = True Then oblrow = "03203"
If Selection.Find.Execute(FindText:="м.*@Марган", MatchCase:=True, Wrap:=wdFindStop, MatchWildcards:=True) = True Then oblrow = "04213"
Next Row
End Sub
Ответ: 1) благодарю за замечание по поводу последовательности кода
2) немножко модернизировал функцию по знакового разбора в windows-1251(вдруг кому пригодится), и щас собираю информацию и чарах которые мешают(перенос каретки, апостроф 146, а я ищу с 39, ...). Пока уверен в одном: пробел - не проблема
Visual Basic
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
Public Function iAsc(asd As String) As String
iAsc = ""
For i = 1 To Len(asd)
iAsc = iAsc & " * " & Asc(Mid(asd, i, 1))
Next i
 
'массив ASCII таблица кодов символов Windows (Win-1251)
Dim a(1 To 258, 1 To 2) As String
 
a(1, 1) = "255": a(1, 2) = "я"
a(2, 1) = "254": a(2, 2) = "ю"
a(3, 1) = "253": a(3, 2) = "э"
a(4, 1) = "252": a(4, 2) = "ь"
a(5, 1) = "251": a(5, 2) = "ы"
a(6, 1) = "250": a(6, 2) = "ъ"
a(7, 1) = "249": a(7, 2) = "щ"
a(8, 1) = "248": a(8, 2) = "ш"
a(9, 1) = "247": a(9, 2) = "ч"
a(10, 1) = "246": a(10, 2) = "ц"
a(11, 1) = "245": a(11, 2) = "х"
a(12, 1) = "244": a(12, 2) = "ф"
a(13, 1) = "243": a(13, 2) = "у"
a(14, 1) = "242": a(14, 2) = "т"
a(15, 1) = "241": a(15, 2) = "с"
a(16, 1) = "240": a(16, 2) = "р"
a(17, 1) = "239": a(17, 2) = "п"
a(18, 1) = "238": a(18, 2) = "о"
a(19, 1) = "237": a(19, 2) = "н"
a(20, 1) = "236": a(20, 2) = "м"
a(21, 1) = "235": a(21, 2) = "л"
a(22, 1) = "234": a(22, 2) = "к"
a(23, 1) = "233": a(23, 2) = "й"
a(24, 1) = "232": a(24, 2) = "и"
a(25, 1) = "231": a(25, 2) = "з"
a(26, 1) = "230": a(26, 2) = "ж"
a(27, 1) = "229": a(27, 2) = "е"
a(28, 1) = "228": a(28, 2) = "д"
a(29, 1) = "227": a(29, 2) = "г"
a(30, 1) = "226": a(30, 2) = "в"
a(31, 1) = "225": a(31, 2) = "б"
a(32, 1) = "224": a(32, 2) = "а"
a(33, 1) = "223": a(33, 2) = "Я"
a(34, 1) = "222": a(34, 2) = "Ю"
a(35, 1) = "221": a(35, 2) = "Э"
a(36, 1) = "220": a(36, 2) = "Ь"
a(37, 1) = "219": a(37, 2) = "Ы"
a(38, 1) = "218": a(38, 2) = "Ъ"
a(39, 1) = "217": a(39, 2) = "Щ"
a(40, 1) = "216": a(40, 2) = "Ш"
a(41, 1) = "215": a(41, 2) = "Ч"
a(42, 1) = "214": a(42, 2) = "Ц"
a(43, 1) = "213": a(43, 2) = "Х"
a(44, 1) = "212": a(44, 2) = "Ф"
a(45, 1) = "211": a(45, 2) = "У"
a(46, 1) = "210": a(46, 2) = "Т"
a(47, 1) = "209": a(47, 2) = "С"
a(48, 1) = "208": a(48, 2) = "Р"
a(49, 1) = "207": a(49, 2) = "П"
a(50, 1) = "206": a(50, 2) = "О"
a(51, 1) = "205": a(51, 2) = "Н"
a(52, 1) = "204": a(52, 2) = "М"
a(53, 1) = "203": a(53, 2) = "Л"
a(54, 1) = "202": a(54, 2) = "К"
a(55, 1) = "201": a(55, 2) = "Й"
a(56, 1) = "200": a(56, 2) = "И"
a(57, 1) = "199": a(57, 2) = "З"
a(58, 1) = "198": a(58, 2) = "Ж"
a(59, 1) = "197": a(59, 2) = "Е"
a(60, 1) = "196": a(60, 2) = "Д"
a(61, 1) = "195": a(61, 2) = "Г"
a(62, 1) = "194": a(62, 2) = "В"
a(63, 1) = "193": a(63, 2) = "Б"
a(64, 1) = "192": a(64, 2) = "А"
a(65, 1) = "191": a(65, 2) = "ї"
a(66, 1) = "190": a(66, 2) = "ѕ"
a(67, 1) = "189": a(67, 2) = "Ѕ"
a(68, 1) = "188": a(68, 2) = "ј"
a(69, 1) = "187": a(69, 2) = "»"
a(70, 1) = "186": a(70, 2) = "є"
a(71, 1) = "185": a(71, 2) = "№"
a(72, 1) = "184": a(72, 2) = "ё"
a(73, 1) = "183": a(73, 2) = "·"
a(74, 1) = "182": a(74, 2) = "¶"
a(75, 1) = "181": a(75, 2) = "µ"
a(76, 1) = "180": a(76, 2) = "ґ"
a(77, 1) = "179": a(77, 2) = "і"
a(78, 1) = "178": a(78, 2) = "І"
a(79, 1) = "177": a(79, 2) = "±"
a(80, 1) = "176": a(80, 2) = "°"
a(81, 1) = "175": a(81, 2) = "Ї"
a(82, 1) = "174": a(82, 2) = "®"
a(83, 1) = "173": a(83, 2) = "*"
a(84, 1) = "172": a(84, 2) = "¬"
a(85, 1) = "171": a(85, 2) = "«"
a(86, 1) = "170": a(86, 2) = "Є"
a(87, 1) = "169": a(87, 2) = "©"
a(88, 1) = "168": a(88, 2) = "Ё"
a(89, 1) = "167": a(89, 2) = "§"
a(90, 1) = "166": a(90, 2) = "¦"
a(91, 1) = "165": a(91, 2) = "Ґ"
a(92, 1) = "164": a(92, 2) = "¤"
a(93, 1) = "163": a(93, 2) = "Ћ"
a(94, 1) = "162": a(94, 2) = "ў"
a(95, 1) = "161": a(95, 2) = "Ў"
a(96, 1) = "160": a(96, 2) = ""
a(97, 1) = "159": a(97, 2) = "џ"
a(98, 1) = "158": a(98, 2) = "ћ"
a(99, 1) = "157": a(99, 2) = "ќ"
a(100, 1) = "156": a(100, 2) = "њ"
a(101, 1) = "155": a(101, 2) = "›"
a(102, 1) = "154": a(102, 2) = "љ"
a(103, 1) = "153": a(103, 2) = "™"
a(104, 1) = "152": a(104, 2) = "h"
a(105, 1) = "151": a(105, 2) = "—"
a(106, 1) = "150": a(106, 2) = "–"
a(107, 1) = "149": a(107, 2) = "•"
a(108, 1) = "148": a(108, 2) = "”"
a(109, 1) = "147": a(109, 2) = "“"
a(110, 1) = "146": a(110, 2) = "’"
a(111, 1) = "145": a(111, 2) = "‘"
a(112, 1) = "144": a(112, 2) = "ђ"
a(113, 1) = "143": a(113, 2) = "Џ"
a(114, 1) = "142": a(114, 2) = "Ћ"
a(115, 1) = "141": a(115, 2) = "Ќ"
a(116, 1) = "140": a(116, 2) = "Њ"
a(117, 1) = "139": a(117, 2) = "‹ ‹"
a(118, 1) = "138": a(118, 2) = "Љ"
a(119, 1) = "137": a(119, 2) = "‰"
a(120, 1) = "136": a(120, 2) = "€"
a(121, 1) = "135": a(121, 2) = "‡"
a(122, 1) = "134": a(122, 2) = "†"
a(123, 1) = "133": a(123, 2) = "…"
a(124, 1) = "132": a(124, 2) = "„"
a(125, 1) = "131": a(125, 2) = "ѓ"
a(126, 1) = "130": a(126, 2) = "‚"
a(127, 1) = "129": a(127, 2) = "Ѓ"
a(128, 1) = "128": a(128, 2) = "Ђ"
a(129, 1) = "127": a(129, 2) = "Ѓ"
a(130, 1) = "126": a(130, 2) = "~"
a(131, 1) = "125": a(131, 2) = "}"
a(132, 1) = "124": a(132, 2) = "|"
a(133, 1) = "123": a(133, 2) = "{"
a(134, 1) = "122": a(134, 2) = "z"
a(135, 1) = "121": a(135, 2) = "y(eng)"
a(136, 1) = "120": a(136, 2) = "x(eng)"
a(137, 1) = "119": a(137, 2) = "w"
a(138, 1) = "118": a(138, 2) = "v"
a(139, 1) = "117": a(139, 2) = "u(eng)"
a(140, 1) = "116": a(140, 2) = "t"
a(141, 1) = "115": a(141, 2) = "s"
a(142, 1) = "114": a(142, 2) = "r"
a(143, 1) = "113": a(143, 2) = "q"
a(144, 1) = "112": a(144, 2) = "p(eng)"
a(145, 1) = "111": a(145, 2) = "o(eng)"
a(146, 1) = "110": a(146, 2) = "n"
a(147, 1) = "109": a(147, 2) = "m(eng)"
a(148, 1) = "108": a(148, 2) = "l(eng)"
a(149, 1) = "107": a(149, 2) = "k"
a(150, 1) = "106": a(150, 2) = "j(eng)"
a(151, 1) = "105": a(151, 2) = "i(eng)"
a(152, 1) = "104": a(152, 2) = ""
a(153, 1) = "103": a(153, 2) = "g"
a(154, 1) = "102": a(154, 2) = "f"
a(155, 1) = "101": a(155, 2) = "e(eng)"
a(156, 1) = "100": a(156, 2) = "d"
a(157, 1) = "99": a(157, 2) = "c(eng)"
a(158, 1) = "98": a(158, 2) = "b(eng)"
a(159, 1) = "97": a(159, 2) = "a(eng)"
a(160, 1) = "96": a(160, 2) = "`"
a(161, 1) = "95": a(161, 2) = "_"
a(162, 1) = "94": a(162, 2) = "^"
a(163, 1) = "93": a(163, 2) = "]"
a(164, 1) = "92": a(164, 2) = ""
a(165, 1) = "91": a(165, 2) = "["
a(166, 1) = "90": a(166, 2) = "Z"
a(167, 1) = "89": a(167, 2) = "Y(eng)"
a(168, 1) = "88": a(168, 2) = "X(eng)"
a(169, 1) = "87": a(169, 2) = "W"
a(170, 1) = "86": a(170, 2) = "V"
a(171, 1) = "85": a(171, 2) = "U"
a(172, 1) = "84": a(172, 2) = "T(eng)"
a(173, 1) = "83": a(173, 2) = "S"
a(174, 1) = "82": a(174, 2) = "R"
a(175, 1) = "81": a(175, 2) = "Q"
a(176, 1) = "80": a(176, 2) = "P(eng)"
a(177, 1) = "79": a(177, 2) = "O(eng)"
a(178, 1) = "78": a(178, 2) = "N"
a(179, 1) = "77": a(179, 2) = "M(eng)"
a(180, 1) = "76": a(180, 2) = "L"
a(181, 1) = "75": a(181, 2) = "K"
a(182, 1) = "74": a(182, 2) = "J"
a(183, 1) = "73": a(183, 2) = "I(eng)"
a(184, 1) = "72": a(184, 2) = "H(eng)"
a(185, 1) = "71": a(185, 2) = "G"
a(186, 1) = "70": a(186, 2) = "F"
a(187, 1) = "69": a(187, 2) = "E(eng)"
a(188, 1) = "68": a(188, 2) = "D"
a(189, 1) = "67": a(189, 2) = "C(eng)"
a(190, 1) = "66": a(190, 2) = "B(eng)"
a(191, 1) = "65": a(191, 2) = "A(eng)"
a(192, 1) = "64": a(192, 2) = "@"
a(193, 1) = "63": a(193, 2) = "?"
a(194, 1) = "62": a(194, 2) = ">"
a(195, 1) = "61": a(195, 2) = "="
a(196, 1) = "60": a(196, 2) = "<"
a(197, 1) = "59": a(197, 2) = ";"
a(198, 1) = "58": a(198, 2) = ":"
a(199, 1) = "57": a(199, 2) = "9"
a(200, 1) = "56": a(200, 2) = "8"
a(201, 1) = "55": a(201, 2) = "7"
a(202, 1) = "54": a(202, 2) = "6"
a(203, 1) = "53": a(203, 2) = "5"
a(204, 1) = "52": a(204, 2) = "4"
a(205, 1) = "51": a(205, 2) = "3"
a(206, 1) = "50": a(206, 2) = "2"
a(207, 1) = "49": a(207, 2) = "1"
a(208, 1) = "48": a(208, 2) = "0"
a(209, 1) = "47": a(209, 2) = "/"
a(210, 1) = "46": a(210, 2) = "."
a(211, 1) = "45": a(211, 2) = "-"
a(212, 1) = "44": a(212, 2) = ","
a(213, 1) = "43": a(213, 2) = "+"
a(214, 1) = "42": a(214, 2) = "*"
a(215, 1) = "41": a(215, 2) = ")"
a(216, 1) = "40": a(216, 2) = "("
a(217, 1) = "39": a(217, 2) = "'"
a(218, 1) = "38": a(218, 2) = "&"
a(219, 1) = "37": a(219, 2) = "%"
a(220, 1) = "36": a(220, 2) = "$"
a(221, 1) = "35": a(221, 2) = "#"
a(222, 1) = "34": a(222, 2) = """"
a(223, 1) = "33": a(223, 2) = "!"
a(224, 1) = Chr(42): a(224, 2) = "" 'звездочки убираем
a(225, 1) = Chr(32): a(225, 2) = "" 'пробелы убираем
a(226, 1) = "32": a(226, 2) = Chr(32) & " (Пробел) "
a(227, 1) = "31": a(227, 2) = Chr(31) & "Разделитель модулей "
a(228, 1) = "30": a(228, 2) = Chr(30) & "Разделитель записей "
a(229, 1) = "29": a(229, 2) = Chr(29) & "Разделитель группы "
a(230, 1) = "28": a(230, 2) = Chr(28) & "Разделитель файлов "
a(231, 1) = "27": a(231, 2) = Chr(27) & "Ключ "
a(232, 1) = "26": a(232, 2) = Chr(26) & "Замена "
a(233, 1) = "25": a(233, 2) = Chr(25) & "Конец среды "
a(234, 1) = "24": a(234, 2) = Chr(24) & "Отказ "
a(235, 1) = "23": a(235, 2) = Chr(23) & "Конец передаваемого блока "
a(236, 1) = "22": a(236, 2) = Chr(22) & "Синхронизация "
a(237, 1) = "21": a(237, 2) = Chr(21) & "Отрицательное подтверждение "
a(238, 1) = "20": a(238, 2) = Chr(20) & "Управление устройством 4 "
a(239, 1) = "19": a(239, 2) = Chr(19) & "Управление устройством 3 "
a(240, 1) = "18": a(240, 2) = Chr(18) & "Управление устройством 2 "
a(241, 1) = "17": a(241, 2) = Chr(17) & "Управление устройством 1 "
a(242, 1) = "16": a(242, 2) = Chr(16) & "Ключ связи данных "
a(243, 1) = "15": a(243, 2) = Chr(15) & "Включить сдвиг "
a(244, 1) = "14": a(244, 2) = Chr(14) & "Выключить сдвиг "
a(245, 1) = "13": a(245, 2) = Chr(13) & "Возврат каретки "
a(246, 1) = "12": a(246, 2) = Chr(12) & "Новая страница "
a(247, 1) = "11": a(247, 2) = Chr(11) & "Вертикальная табуляция "
a(248, 1) = "10": a(248, 2) = Chr(10) & "Перевод строки "
a(249, 1) = "9": a(249, 2) = Chr(9) & "Горизонтальная табуляция "
a(250, 1) = "8": a(250, 2) = Chr(8) & "Забой (шаг назад) "
a(251, 1) = "7": a(251, 2) = Chr(7) & "Сигнал (звонок) "
a(252, 1) = "6": a(252, 2) = Chr(6) & "Подтверждение "
a(253, 1) = "5": a(253, 2) = Chr(5) & "Запрос "
a(254, 1) = "4": a(254, 2) = Chr(4) & "Конец передачи "
a(255, 1) = "3": a(255, 2) = Chr(3) & "Конец текста "
a(256, 1) = "2": a(256, 2) = Chr(2) & "Начало текста "
a(257, 1) = "1": a(257, 2) = Chr(1) & "Начало заголовка "
a(258, 1) = "0": a(258, 2) = Chr(0) & "Нуль "
 
Dim BackwardInterpretation As String
BackwardInterpretation = Mid(iAsc, 4)
For m = 1 To 258
BackwardInterpretation = Replace(BackwardInterpretation, a(m, 1), a(m, 2))
Next m
MsgBox (Mid(iAsc, 4) & vbCr & vbCr & _
"текст в ASCII таблице кодов символов Windows (Win-1251)определен как: " & vbCr & vbCr _
& BackwardInterpretation)
 
End Function
Вопрос: Оптимизация плохого кода проекта wpf

Здравствуйте. Есть програмка суть которой в следущеем: в лейбл выводится текст на английском языке и пользователь должен ввести в текстбокс перевод. По нажатию на кнопку далее выводится следущее значение для перевода. По нажатию на кнопку "swap" выражения и перевод меняются местами. То есть в лейбл выводится текст на украинском а пользователь должен ввести перевод на английском.


Выражения и перевод к ним хранятся в БД MS SQL Server которую я предварительно создал в MS SQL Studio и подключил к проекту через Entity Framework. То есть табличка на 2 стлобца, приведенная к списку. При нажатии на кнопку "Farther" список дает мне значения по индексу. counter.

Можно ли как-то оптимизировать этот код. Особенно интересует можно ли как то реализовать действие кнопки "swap" не копируя один и тот же код.





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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
 public partial class Simulator : Window
    {
        static private MainDictionary mDict;
        bool changeLang=false;//нажата ли кнопка изменения языков 
       
        int counter = 0;//счетчик для движения по списку
        public Simulator()
        {
            InitializeComponent();
            mDict = new MainDictionary();
            PrimaryData();//перед нажатием кнопки нужно вывести значение для перевода
        }
 
 
 
        private void Cirle() {
 
            if (textBox.Text == String.Empty)//текст бокс пустой?
            {
                MessageBox.Show("Введіть текст");
                return;
            }
 
            using (mDict = new MainDictionary())//открываю соединение с БД 
            {
                var frasalVerb = mDict.FrasalVerbs.ToList(); //преобразовываю в список
 
                if(changeLang) {                                                 //кнопка "Swap" нажата?
                    textBox.Clear();
                    label1.Content = String.Empty;
                    if (counter < frasalVerb.Count - 1)              //если не конец списка
                    {
 
 
                        if (textBox.Text.ToLower().Equals(frasalVerb[counter].English.ToLower())) //если перевод совпадает
                        {
                            textBox.BorderBrush = Brushes.Green;
                            counter++;
                            label1.Content = String.Empty;
                            textBox.Clear();
                        }
 
                        else                               //если нет
                        {
                            textBox.BorderBrush = Brushes.Red;
                            counter++;
                            label1.Content = String.Empty;
                            textBox.Clear();
 
 
                        }
              label1.Content = frasalVerb[counter].Ukrainian;   //вывод в лейбл следующего значения списка (украинский язык)
 
                    }
 
                }
 
 
                else{                                                 //если кнопка "swap" не была нажата
 
 
 
 
                    if (counter < frasalVerb.Count - 1)//если не конец списка
                    {
 
 
                        if (textBox.Text.ToLower().Equals(frasalVerb[counter].Ukrainian.ToLower())) //если перевод совпадает
                        {
                            textBox.BorderBrush = Brushes.Green;
                            counter++;
                            label1.Content = String.Empty;
                            textBox.Clear();
                        }
                        else                         //если не совпадает
                        {
                            textBox.BorderBrush = Brushes.Red;
                            counter++;
 
                            label1.Content = String.Empty;
                            textBox.Clear();
 
                        }
 
 
 
                        label1.Content = frasalVerb[counter].English; //вывод следующего значения списка (английский язык)
 
                    }
 
                    else                   // если конец списка
                    {
                        label1.Content = String.Empty;
                        textBox.Clear();
                        MessageBoxResult result = MessageBox.Show("Почати знову?", "Кінець", MessageBoxButton.YesNo);
                        if (result == MessageBoxResult.Yes)
                        {
                            counter = 0;
                            PrimaryData();
                        }
                        else
                        {
                            this.Close();
                        }
                    }
 
                }
                
 
 
            }
 
 
 
        }
 
 
        private void PrimaryData()
        {
            using (mDict = new MainDictionary())
            {
                var frasalVerb = mDict.FrasalVerbs.ToList();
                label1.Content = frasalVerb[counter].English;
            }
        }
       
 
 
        private void button_Click(object sender, RoutedEventArgs e)
        {
 
 
            Cirle();
 
        }
        
 
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            changeLang = true;
        }
    }




Понимаю что этот код ужасен но никак не могу понять как его улучшить. И убрать копипасту . Буду благодарен за совет.
Ответ: неплохой код

Как минимум вы можете выделить в отдельные методы проверку слов (не привязываясь к контролам) в зависимости от значения swap, который будет возвращать bool. На основании результата вы красите ваш textbox и делаете остальные действия, которые схожи.

Что-то вроде такого должно получится:
Кликните здесь для просмотра всего текста
Названия методов также поменять
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
        int _counter;
        public int NextWordIndex{
            get {return ++_counter;}}
        
        public string GetNextWord() 
            => return Words[NextWordIndex]; // заменить на свое
        
        public void btNextWordClick(object sender, EventArgs e) 
        { 
            if (textbox.Text != "") 
            { 
        
                var result = IsEnglish? IsCorrectEngTranslation(label1.Content, textboxt.Text)
                    : IsCorrectUATranslation(label1.Content, textboxt.Text) ;
                
                if (result)
                    textBox.BorderBrush = Brushes.Green;
                   
                else  
                    textBox.BorderBrush = Brushes.Red;
                    
                label1.Content = GetNextWord();
                textBox.Clear();
        
            } 
         
            else
             MessageBox.Show("Введіть текст");
         
        }


Также проверку на заполненность textbox вынесите до вызова Cirle. Чисто логически можно понять - button_click - обработчик вьюхи, так пусть он и работает с контролами.

button1_Click - по нажатию только 1 раз смену языка можно сделать?

Переименнуйте методы по их функциональному назначению.
Вопрос: Оптимизация программного кода

Помогите пожалуйста оптимизировать данный код
Delphi
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Shape1: TShape;
    Shape2: TShape;
    Shape3: TShape;
    Shape4: TShape;
    Shape5: TShape;
    Shape6: TShape;
    Shape7: TShape;
    Shape8: TShape;
    Shape9: TShape;
    Shape10: TShape;
    GroupBox1: TGroupBox;
    Shape11: TShape;
    Shape12: TShape;
    Shape13: TShape;
    Shape14: TShape;
    Shape15: TShape;
    Shape16: TShape;
    Shape17: TShape;
    Shape18: TShape;
    Shape19: TShape;
    Shape20: TShape;
    Shape21: TShape;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Button3: TButton;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    Label17: TLabel;
    Label18: TLabel;
    Label19: TLabel;
    Label20: TLabel;
    Label21: TLabel;
    Label22: TLabel;
    Label23: TLabel;
    Label24: TLabel;
    TrackBar1: TTrackBar;
    Button2: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    procedure TrackBar1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
   
  private
    { Private declarations }
 
  public
    { Public declarations }
    end;
 
var
  Form1: TForm1;
  r,g,b:Byte;
  light:boolean;
  q:integer;
  s:string;
implementation
{$R *.dfm}
 
procedure TForm1.TrackBar1Change(Sender: TObject);
var i,j:integer;
begin
light:=false;
if trackbar1.Position=1 then form1.Color:=rgb(0,12,70);
if trackbar1.Position=2 then form1.Color:=rgb(0,12,85);
if trackbar1.Position=3 then form1.Color:=rgb(0,12,100);
if trackbar1.Position=4 then form1.Color:=rgb(0,12,115);
if trackbar1.Position=5 then form1.Color:=rgb(0,12,130);
if trackbar1.Position=6 then form1.Color:=rgb(0,12,145);
if trackbar1.Position=7 then form1.Color:=rgb(0,12,160);
if trackbar1.Position=8 then form1.Color:=rgb(0,12,175);
if trackbar1.Position=9 then form1.Color:=rgb(0,12,190);
if trackbar1.Position=10 then form1.Color:=rgb(0,12,205);
if trackbar1.Position=11 then form1.Color:=rgb(0,12,220);
if trackbar1.Position=12 then form1.Color:=rgb(0,12,235);
if trackbar1.Position=13 then form1.Color:=rgb(0,12,250);
if trackbar1.Position=14 then form1.Color:=rgb(0,12,255);
if trackbar1.Position=15 then form1.Color:=rgb(0,12,225);
if trackbar1.Position=16 then form1.Color:=rgb(0,12,205);
if trackbar1.Position=17 then form1.Color:=rgb(0,12,191);
if trackbar1.Position=18 then form1.Color:=rgb(0,12,175);
if trackbar1.Position=19 then form1.Color:=rgb(0,12,160);
if trackbar1.Position=20 then form1.Color:=rgb(0,12,145);
if trackbar1.Position=21 then form1.Color:=rgb(0,12,130);
if trackbar1.Position=22 then form1.Color:=rgb(0,12,115);
if trackbar1.Position=23 then form1.Color:=rgb(0,12,105);
if trackbar1.Position=24 then form1.Color:=rgb(0,12,85);
if trackbar1.Position=5 then
begin
shape15.brush.Color:=clyellow;
button3.Caption:='On';
end;
if trackbar1.Position=6 then
begin
shape15.brush.Color:=clwhite;
button3.Caption:='Of';
end;
for i:=11 to 21 do
begin
if trackbar1.Position=18 then begin
with tshape(FindComponent('shape'+inttostr(i))) do
brush.color:=clyellow;
for j:=1 to 9 do
with tbutton(FindComponent('button'+inttostr(j))) do
caption:='On';
end;
end;
if trackbar1.Position=22 then
for i:=11 to 21 do
begin
with tshape(FindComponent('shape'+inttostr(i))) do
brush.color:=clwhite;
for j:=1 to 9 do
begin
with tbutton(FindComponent('button'+inttostr(j))) do
caption:='Off';
end;
end;
if trackbar1.Position=24 then
begin
trackbar1.Position:=1;
showmessage('Ïðîøëè ñóòêè');
end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
case Button1.Tag of
0:
begin
Button1.tag:=1;
Button1.caption:='Off';
shape11.Brush.Color:=clwhite;
end;
1:
begin
Button1.tag:=0;
Button1.caption:='On';
shape11.Brush.Color:=clyellow;
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var y:integer;
begin
case Button2.Tag of
0:
begin
Button2.tag:=1;
Button2.caption:='Off';
for y:=12 to 14 do
begin
with tshape(FindComponent('shape'+inttostr(y))) do
brush.color:=clwhite;
end;
end;
1:
begin
Button2.tag:=0;
Button2.caption:='On';
for y:=12 to 14 do
begin
with tshape(FindComponent('shape'+inttostr(y))) do
brush.color:=clyellow;
end;
end;
end;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
case Button3.Tag of
0:
begin
Button3.tag:=1;
Button3.caption:='Off';
shape15.Brush.Color:=clwhite;
end;
1:
begin
Button3.tag:=0;
Button3.caption:='On';
shape15.Brush.Color:=clyellow;
end;
end;
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
case Button4.Tag of
0:
begin
Button4.tag:=1;
Button4.caption:='Off';
shape16.Brush.Color:=clwhite;
end;
1:
begin
Button4.tag:=0;
Button4.caption:='On';
shape16.Brush.Color:=clyellow;
end;
end;
end;
 
procedure TForm1.Button5Click(Sender: TObject);
begin
case Button5.Tag of
0:
begin
Button5.tag:=1;
Button5.caption:='Off';
shape17.Brush.Color:=clwhite;
end;
1:
begin
Button5.tag:=0;
Button5.caption:='On';
shape17.Brush.Color:=clyellow;
end;
end;
end;
 
procedure TForm1.Button6Click(Sender: TObject);
begin
case Button6.Tag of
0:
begin
Button6.tag:=1;
Button6.caption:='Off';
shape18.Brush.Color:=clwhite;
end;
1:
begin
Button6.tag:=0;
Button6.caption:='On';
shape18.Brush.Color:=clyellow;
end;
end;
end;
 
procedure TForm1.Button7Click(Sender: TObject);
begin
case Button7.Tag of
0:
begin
Button7.tag:=1;
Button7.caption:='Off';
shape19.Brush.Color:=clwhite;
end;
1:
begin
Button7.tag:=0;
Button7.caption:='On';
shape19.Brush.Color:=clyellow;
end;
end;
end;
 
procedure TForm1.Button8Click(Sender: TObject);
begin
case Button8.Tag of
0:
begin
Button8.tag:=1;
Button8.caption:='Off';
shape20.Brush.Color:=clwhite;
end;
1:
begin
Button8.tag:=0;
Button8.caption:='On';
shape20.Brush.Color:=clyellow;
end;
end;
end;
 
procedure TForm1.Button9Click(Sender: TObject);
begin
case Button9.Tag of
0:
begin
Button9.tag:=1;
Button9.caption:='Off';
shape21.Brush.Color:=clwhite;
end;
1:
begin
Button9.tag:=0;
Button9.caption:='On';
shape21.Brush.Color:=clyellow;
end;
end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 
end;
 
end.
Ответ: Иногда у меня при просмотре чужого кода возникает ощущение, что его автор меня троллит. Ибо такую аццкую дичь по незнанию написать просто невозможно - только специально!

Вот и щас как раз тот случай. От одного вот этого закурить хочется, хотя бросил 5 лет назад.
Delphi
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
procedure TForm1.TrackBar1Change(Sender: TObject);
var i,j:integer;
begin
light:=false;
if trackbar1.Position=1 then form1.Color:=rgb(0,12,70);
if trackbar1.Position=2 then form1.Color:=rgb(0,12,85);
if trackbar1.Position=3 then form1.Color:=rgb(0,12,100);
if trackbar1.Position=4 then form1.Color:=rgb(0,12,115);
if trackbar1.Position=5 then form1.Color:=rgb(0,12,130);
if trackbar1.Position=6 then form1.Color:=rgb(0,12,145);
if trackbar1.Position=7 then form1.Color:=rgb(0,12,160);
if trackbar1.Position=8 then form1.Color:=rgb(0,12,175);
if trackbar1.Position=9 then form1.Color:=rgb(0,12,190);
if trackbar1.Position=10 then form1.Color:=rgb(0,12,205);
if trackbar1.Position=11 then form1.Color:=rgb(0,12,220);
if trackbar1.Position=12 then form1.Color:=rgb(0,12,235);
if trackbar1.Position=13 then form1.Color:=rgb(0,12,250);
if trackbar1.Position=14 then form1.Color:=rgb(0,12,255);
if trackbar1.Position=15 then form1.Color:=rgb(0,12,225);
if trackbar1.Position=16 then form1.Color:=rgb(0,12,205);
if trackbar1.Position=17 then form1.Color:=rgb(0,12,191);
if trackbar1.Position=18 then form1.Color:=rgb(0,12,175);
if trackbar1.Position=19 then form1.Color:=rgb(0,12,160);
if trackbar1.Position=20 then form1.Color:=rgb(0,12,145);
if trackbar1.Position=21 then form1.Color:=rgb(0,12,130);
if trackbar1.Position=22 then form1.Color:=rgb(0,12,115);
if trackbar1.Position=23 then form1.Color:=rgb(0,12,105);
if trackbar1.Position=24 then form1.Color:=rgb(0,12,85);
if trackbar1.Position=5 then
begin
shape15.brush.Color:=clyellow;
button3.Caption:='On';
end;
if trackbar1.Position=6 then
begin
shape15.brush.Color:=clwhite;
button3.Caption:='Of';
end;
for i:=11 to 21 do
begin
if trackbar1.Position=18 then begin
with tshape(FindComponent('shape'+inttostr(i))) do
brush.color:=clyellow;
for j:=1 to 9 do
with tbutton(FindComponent('button'+inttostr(j))) do
caption:='On';
end;
end;
if trackbar1.Position=22 then
for i:=11 to 21 do
begin
with tshape(FindComponent('shape'+inttostr(i))) do
brush.color:=clwhite;
for j:=1 to 9 do
begin
with tbutton(FindComponent('button'+inttostr(j))) do
caption:='Off';
end;
end;
if trackbar1.Position=24 then
begin
trackbar1.Position:=1;
showmessage('Ïðîøëè ñóòêè');
end;
end;
Этот код не надо оптимизировать, его надо отправить ФТОПКУ и написать прогу заново.
З.Ы. Это моё личное мнение. Никому не навязываю.
Вопрос: Как оптимизировать LINQ заявку

Всем привет. Есть у нас метод. При таком подходе мы ведь выполняем излишнюю работу, вытаскивая вначале одного юзера со всеми его заказами. После чего уже в ифе считаем сумму всех его заказов. Возможно ли этот запрос сделать одной заявкой на LINQ?
Так же возникает вопрос, а что делать если придёться делать две заявки? Возможно ли их как то организовать что бы послать их одновременно, вместо того что бы делать два запроса к бд?
public CustomerAndOrdersPriceInfo GetCustomerAndOrdersPrice(int id)
{
    var customer = db.Customers
        .Include(c => c.Orders)
        .Where(c => c.CustomerId == id)
        .FirstOrDefault();

    if (customer != null)
    {
        CustomerAndOrdersPriceInfo record = new CustomerAndOrdersPriceInfo();
        record.FirstName = customer.FirstName;
        record.LastName = customer.LastName;
        record.Price = customer.Orders
            .GroupBy(o => o.CustomerId)
            .Select(c => c.Sum(o => o.Price)).
            .FirstOrDefault();

        return record;
    }

    return null;
}
Ответ:
Nechto
Я так понимаю это дополнение к EF Code First?


Нет, это не дополнение к EF и никак с ним напрямую не связано. AutoMapper это грубо говоря средство для копирования значений свойств экземпляра одного класса в экземпляр другого класса. Особенность этой библиотеки в том, что она умеет делать проекции для LINQ, которые «понимает» EF. Т.е. можно определить DTO класс, в который проецируются сущности EF, при этом строится эффективный SQL-запрос, которым можно управлять в конфигурации отражения AutoMapper.

По большему счёту это даёт возможность практически забыть о голом SQL в подавляющем большинстве случаев, и при этом не потеря в возможности строить эффективные запросы. Остаются только тяжёлые случаи для оптимизаций, которые решаются отражением SQL VIEW на сущность EF, и оставшиеся совсем редкие случаи — это вызовы функций и процедур из SQL, но мы научились полностью обходиться без них. Мы находим элегантные быстрые решения без привлечения SQL там, где многие корифеи с пеной у рта нам доказывали, что мы без SQL утрёмся.
Вопрос: Оптимизация кода, нарушающего правила strict aliasing

Доброго времени суток. Имеется такой код в ядре Linux:
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
/* include/linux/netlink.h */
....
#define NETLINK_CB(skb)         (*(struct netlink_skb_parms*)&((skb)->cb))
....
/**
 * nlmsg_multicast - multicast a netlink message
 * @sk: netlink socket to spread messages to
 * @skb: netlink message as socket buffer
 * @pid: own netlink pid to avoid sending to yourself
 * @group: multicast group id
 * @flags: allocation flags
 */
static inline int nlmsg_multicast(struct sock *sk, struct sk_buff *skb,
                                  u32 pid, unsigned int group, gfp_t flags)
{
        int err;
 
        NETLINK_CB(skb).dst_group = group;
 
        err = netlink_broadcast(sk, skb, pid, group, flags);
        if (err > 0)
                err = 0;
 
        return err;
}
стоит задача оптимизации этого кода так, чтобы он не нарушал правила strict aliasing ( ). Да, я знаю, у линукса другая политика относительно правил strict aliasing и по умолчанию ядро компилируется с -fno-strict-aliasing, но все же интересно, можно ли сколько-нибудь заметно оптимизировать работу ядра, путем приведения таких примеров кода, к аналогичным, не нарушающим strict aliasing.
После некоторого раздумья я пришел к такому варианту:
C
1
2
3
4
5
6
7
static struct netlink_skb_parms *to_netlink_skb_parms(struct sk_buff *skb) {
       struct netlink_skb_parms *tmp;
       memcpy(&tmp, &((skb)->cb), 48);
       return tmp;
}
 
#define NETLINK_CB(skb) to_netlink_skb_parms(skb)
На что компилятор ответил:
C
1
2
3
4
In file included from /media/chrono/Other/Chrono_Kernel-1/lib/kobject_uevent.c:25:0:
/media/chrono/Other/Chrono_Kernel-1/include/linux/netlink.h: In function ‘nlmsg_multicast’:
/media/chrono/Other/Chrono_Kernel-1/include/linux/netlink.h:38:24: error: request for member ‘dst_group’ in something not a structure or union
         NETLINK_CB(skb).dst_group = group;
В чем ошибка? Для полноты картины привожу также определения структур struct netlink_skb_parms и sk_buff :
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct netlink_skb_parms {
    struct ucred        creds;      /* Skb credentials  */
    __u32           pid;
    __u32           dst_group;
};
 
struct sk_buff {
    .....
 
    /*
     * This is the control buffer. It is free to use for every
     * layer. Please put your private variables there. If you
     * want to keep them across layers you have to do a skb_clone()
     * first. This is owned by whoever has the skb queued ATM.
     */
    char            cb[48] __aligned(8);
 
    ....
};
Попутный вопрос. Написал простейший бенчмарк для сравнения производительности кода с нарушением strict aliasing и без(используя аналогичный исходному код).
Судя по получившимся результатам, в случае нарушений strict aliasing, код работает примерно на 20% медленнее. Другое дело, что применения флага -fstrict-aliasing, похоже, вообще не повлияло на скорость работы кода. Вопрос в следующем - означает ли это, что применение -fstrict-aliasing само по себе не оптимизирует код, а лишь позволяет выявлять (вкупе с -Wstrict-aliasing) то, что файл нарушает strict aliasing?
Ответ:
Сообщение от Radical_Dreamer
А так получается, в "лучшем" случае отгенерирует какой-нибудь некорректный код ценой ускорения, которого даже замерить трудно
Некорректный код сгенерируется только в том случае, если исходник был некорректный. По факту имеем, что огромное количество исходников являются некорректными (с точки зрения 100% соответствия стандарту). В случае strict aliasing'а мы имеем дело со случаем, когда реальная жизнь оказывается таковой, что люди не хотят соблюдать стандарт в этом месте, потому что здравый смысл в этом месте преобладал над стандартом. Это не общее правило, а единичное исключение

Насчёт ускорения - множество оптимизаций выглядят примерно так же: каждая даёт привар по чуть-чуть. Но оптимизаций много, и в сумме они дают хороший привар. Для каждой оптимизации есть специфичная область применения и на каждую оптимизацию можно написать синтетический код, который даст весьма ощутимое ускорение. Сама оптимизация отдельно взятая может вообще не иметь никакого эффекта, но имеет сильный эффект для оптимизаций, работающих после неё. Так что тут всё слишком сложно. Конкретно strict aliasing конкретно на интеле большого привара не даёт, т.к. на интеле аппаратура в этом месте хорошо работает, а кэша много. Для других процессоров эффект от strict aliasing'а вполне может оказаться намного большим, чем 1%
Вопрос: Как-то можно сообщить Linq что масив отсортирован?

Осваиваю C#. Про Linq не успел еще книжек почитать, нагуглить не смог.
+ Пример кода
using System;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;

namespace Test {
    class Row
    {
        public String key, value, other;

        public Row(String key, String value) {
            this.key = key;
            this.value = value;
        }
    }

    class Program {
        const Int32 SIZE = 4000;

        static void Main(string[] args) {
            // Заполнение исходыми данными. Вреале читаются из файла
            var l = new List<Row>();
            for (Int32 i = 0; i < SIZE; i++) l.Add(new Row(i.ToString(), (i % 1000).ToString()));
            // Сортировка
            Row[] rows = l.OrderBy(x => x.value).ToArray();
            // Тест
            var sw = Stopwatch.StartNew();
            for (Int32 i = 0; i < SIZE; i++) {
                // Выборка value = i % 1000
                var res = from r in rows 
                          where r.value.Equals((i % 1000).ToString()) 
                          select r;
                Int32 cnt = 0;
                foreach(var x in res) {
                    cnt++;
                    x.other = cnt.ToString(); // Эмуляция работы
                }
                //Console.WriteLine(cnt);
            }
            Console.WriteLine("Linq {0} мс", sw.ElapsedMilliseconds);
            Console.ReadKey();
        }
    }
}

В реале из файла читается таблица, затем содается сортированный (по value) массив (key, value, other). Дальше надо сделать много выборок по конкретным значениям value. Массив отсортирован по value, но как об этом сообщить Linq?

Затестил время (SIZE = 1000 - 90 мс, 4000 - 1280 мс), т.е. сложность алгоритма получается O(n^2). Т.е. тупо перебор.
Можно конечно переписать на BinarySearch(), но может как-то можно с помощью Linq порешать?
Ответ:
bazile
И еще. Советую использовать int вместо Int32 и string вместо String. Это избавляет от необходимости писать using и выделяет данные типы при подсветке синтакисиса.

ИМХУ на вкус и цвет... По мне так Int32 лучше смотрится чем int. Так в коде меньше слов отвлекающих внимание.