Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

опять проблемка в C#

1140  1 2 3 4 5 6 7 все
maxxxl79 прохожий25.11.17 09:41
NEW 25.11.17 09:41 
в ответ beautiful_man 25.11.17 06:23
П.С так и не получается разбить строку на массив одиночных команд, информации много, но знаний языка не хватает.

напишите ещё раз пример строки, которую пытаетесь разбить, и пример того, какой на выходе должен быть массив, ну и как пытаетесь это сделать.


#41 
Murr патриот25.11.17 12:09
Murr
NEW 25.11.17 12:09 
в ответ beautiful_man 25.11.17 06:23

знаний языка не хватает.

------

Знаний языка у тебя достаточно - там будет все тоже самое что уже использовалось - этого достаточно.


А недостаток - в навыках его использования - именно возможности получения этих навыков тебя лишил пример maxxxl79.

#42 
beautiful_man посетитель25.11.17 12:25
NEW 25.11.17 12:25 
в ответ maxxxl79 25.11.17 09:41
GENERATORS DRIVE DISCONNECT switches GUARD CLOSED,laminar/B738/one_way_switch/drive_disconnect1_pos, 0,laminar/B738/one_way_switch/drive_disconnect2_pos, 0,laminar/B738/button_switch/cover_position[4], 0,laminar/B738/button_switch/cover_position[5], 0

в checkedListBox1.Items.Add(ar[0]); вписываем текст до первой запятой:


GENERATORS DRIVE DISCONNECT switches GUARD CLOSED"

остались команды:

laminar/B738/one_way_switch/drive_disconnect1_pos, 0,laminar/B738/one_way_switch/drive_disconnect2_pos, 0,laminar/B738/button_switch/cover_position[4], 0,laminar/B738/button_switch/cover_position[5], 0

эти команды надо отправить через SendXPCommands,


сейчас отправляется только первая команд после запятой:

SendXPCommands(ar[1], param);

надо отправить все разом или поочерёдно.


Затем ставиться галочка в

checkedListBox1.SetItemChecked(checkedListBox1.Items.Count - 1, true);

как то так.

#43 
maxxxl79 прохожий25.11.17 12:29
NEW 25.11.17 12:29 
в ответ beautiful_man 25.11.17 12:25

ок, вечером посмотрю, в гостях пока что.

#44 
beautiful_man посетитель25.11.17 13:07
NEW 25.11.17 13:07 
в ответ maxxxl79 25.11.17 12:29

спасибо!

#45 
AlexNek патриот25.11.17 16:25
AlexNek
NEW 25.11.17 16:25 
в ответ maxxxl79 24.11.17 00:19
примерно так

Постмотрел я примерчик в студии - как можно такое показывать начинающему совершенно непонятно.

Для начала какого там делают "async" и "await"? - разобраться с этим в начале практически невозможно.

Также использование "var" весьма нежелательно.

Какой смысл использовани TryParse без if также непонятно.

А использование nameof вообще выходит за рамки приличий для начинающих. Как и $ , @

Да и вообще эта линия


Console.WriteLine($@"{nameof(SendXPCommand)}({command},{param})");


Одна большая загадка которую непонятно как нужно расшифровывать. Зачем?

Подобный код просто вреден для начинающего.

#46 
  moose старожил25.11.17 21:38
NEW 25.11.17 21:38 
в ответ beautiful_man 25.11.17 12:25

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


0. вот это:

GENERATORS DRIVE DISCONNECT switches GUARD CLOSED,laminar/B738/one_way_switch/drive_disconnect1_pos, 0,laminar/B738/one_way_switch/drive_disconnect2_pos, 0,laminar/B738/button_switch/cover_position[4], 0,laminar/B738/button_switch/cover_position[5], 0

лежит где-то в файле, и организовано так, что разделитель - ВСЕГДА только запятая, первый элемент - некая отдельная сущность, а остальное - попарно идущие единицы. т.е. если разбить всю эту длинную строку на куски там, где запятая, то мы обязательно должны получить нечетное число подстрок. правильно?

0.5 если п.0 верен, то, видимо, нужно выделить первый кусок, а с парами проделать что-то другое, и вы знаете что именно.

1. о каком комбобоксе речь?

2. о каком листбоксе речь?

3. что конкретно вы не знаете как делать, или знаете, но оно не получается?

4. почему вы ленитесь писать что-то, где-то, как-то через черточку? это все равно как я бу ду пи сать во т так. читать сло жно : (


#47 
maxxxl79 прохожий25.11.17 21:38
NEW 25.11.17 21:38 
в ответ beautiful_man 25.11.17 12:25

хорошо бы уточнить, в начале Вы писали, что строки формата

sim/cockpit/electrical/beacon_lights_on, 1

которая по сути сама является командой, насколько я понял.

потом добавили, что строка может быть вида:

GENERATORS DRIVE DISCONNECT switches GUARD CLOSED,laminar/B738/one_way_switch/drive_disconnect1_pos, 0,laminar/B738/one_way_switch/drive_disconnect2_pos, 0,laminar/B738/button_switch/cover_position[4], 0,laminar/B738/button_switch/cover_position[5], 0

и для последнего случая определили, что текст, отображаемый в checkListBox - это текст до первой запятой, далее идет ряд команд, а именно - четыре команды, верно понял? в первом случае что должно отображаться в checkedListBox, там получается в качестве текста должна отображаться сама команда?

#48 
maxxxl79 прохожий25.11.17 22:04
NEW 25.11.17 22:04 
в ответ AlexNek 25.11.17 16:25
Постмотрел я примерчик в студии - как можно такое показывать начинающему совершенно непонятно.
Для начала какого там делают "async" и "await"? - разобраться с этим в начале практически невозможно.

Вы читаете, что пишет ТС? он уже черным по белому написал, он сюда пришел не за курсом программирования, а чтобы ему помогли сваять конкретную вещь.


Также использование "var" весьма нежелательно.

Вы хотите ещё больше оффтопа добавить в тему? )

Если Вы считаете себя гуру, то, наверное, знаете, что var не следует использовать в случаях, например, когда надо задействовать базовый класс или интерфейс, иными словами в том случае, если указание или не указание типа создает неоднозначность, в данном случае правая сторона вполне себе однозначна и использование var в этом случае сводится к стилю, привычке, удобству - с таким же успехом Вы можете сказать, что нежелательно использовать в студии такой-то шрифт, т.к. он портит зрение быстрее другого. И категоричное утверждение, что использование нежелательно натыкается на вопрос - как Вы создаете анонимные типы?


Какой смысл использовани TryParse без if также непонятно.

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


А использование nameof вообще выходит за рамки приличий для начинающих. Как и $ , @

Интересно, а чем так сложно использование nameof? или $? Лишь тем, что это появилось в более поздних версиях шарпа? Почему человек, который хоть и начинающий, не может использовать в коде то, что есть в языке на сегодняшний день? Вы считаете, что раз человек плохо знает язык, то использовать он должен только C# 2.0 например?


Забавно, Вы находите время заходить в тему, посмотреть код в студии, поцокать языком, покачать головой, написать как всё плохо и как всё вредно и как это всё не поможет ТС, но сами при этом ничего путного ему не написали. Так сделайте это, напишите ему код, который он в лёт поймет, и все будут довольны.

#49 
AlexNek патриот25.11.17 23:06
AlexNek
NEW 25.11.17 23:06 
в ответ maxxxl79 25.11.17 22:04
Если Вы считаете себя гуру

Я себя, грубо говоря, никем не считаю - просто высказываю свое мнение.


как Вы создаете анонимные типы?

А никак не создаю - не требовалось пока. Хотя вот это и есть фактически единственное использование var.


Интересно, а чем так сложно использование nameof? или $?

Тем что это, во первых не нужно, а вторых непонятно.

Достаточно просто сравнить

"SendXPCommand " + command + "," + param.ToString();


$@"{nameof(SendXPCommand)}({command},{param})"


Почему человек, который хоть и начинающий, не может использовать в коде то, что есть в языке на сегодняшний день?

Вы путаете сущности.

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


Так сделайте это, напишите ему код, который он в лёт поймет

Вообще то это самое простое, что можно сделать, но какой в этом смысл?

#50 
maxxxl79 прохожий25.11.17 23:52
NEW 25.11.17 23:52 
в ответ AlexNek 25.11.17 23:06
Тем что это, во первых не нужно, а вторых непонятно.

Если Вы считаете что-то ненужным и непонятным, это не значит, что другие должны считать так же.

nameof дает возможность в ряде случае не зашиваться на hard-coded строки, а более формально определять выражение, лично мне стало удобнее работать с Expressions, обработкой эксепшенов, я считаю это хорошим нововведением.


Насчет сравнения строк, Вы же не имеете ничего против:

string.Format("Привет {0}, меня зовут {1}", name1, name2);

Чем плоха более короткая запись?:

"Привет {name1}, меня зовут {name2}"

Мне второй вариант кажется более наглядным. Опять-таки, дело вкуса.

Ваше "не нужно" я бы заменил на "необязательно", что можно при желании говорить к любому синтаксическому сахару.


Вообще то это самое простое, что можно сделать, но какой в этом смысл?

:) удобная фраза, конечно, намного больше смысла по-оффтопить, засорить тему ТС и выдать в конце эту фразу - это к вопросу об уважении.

#51 
  moose старожил26.11.17 00:10
NEW 26.11.17 00:10 
в ответ maxxxl79 25.11.17 23:52

ТС, наверное, испугался и решил затаиться, пока "гуры" срач не прекратят : )

#52 
AlexNek патриот26.11.17 00:52
AlexNek
NEW 26.11.17 00:52 
в ответ maxxxl79 25.11.17 23:52
nameof дает возможность в ряде случае не зашиваться на hard-coded строки

Может вы еще сможете объяснить необходимость использования nameof в данном конкретном случае?


Чем плоха более короткая запись?:

Тем что она просто вредна - у нас разрешено использование исключительно String.Format. Догадываетесь отчего?


намного больше смысла по-оффтопить, засорить тему ТС

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

#53 
  moose старожил26.11.17 01:35
NEW 26.11.17 01:35 
в ответ beautiful_man 25.11.17 12:25, Последний раз изменено 26.11.17 01:41 (moose)

исхожу из того, что я угадал правильно, приведу вам код, несмотря на то, что гуры - против : )


string str = "GENERATORS DRIVE DISCONNECT switches GUARD CLOSED,laminar/B738/one_way_switch/drive_disconnect1_pos, 0,laminar/B738/one_way_switch/drive_disconnect2_pos, 0,laminar/B738/button_switch/cover_position[4], 0,laminar/B738/button_switch/cover_position[5], 0";
string[] lines = str.Split(',');
if (lines.Length > 0 && lines.Length%2 == 1) {
___string separate_item = lines[0];
___//и делаем с эти separate_item что надо (в чекбокс? вы в курсе)
___var query = lines.Skip(1).Select((x, i) => new { Index = i, Value = x }).GroupBy(x => x.Index / 2).Select(x => x.Select(v => v.Value).ToArray()).ToList();
___foreach (string[] pair in query) {
______string first = pair[0];
______string second = pair[1];
______// и получаете здесь в first - вашу "команду", а в second - число, которое вы знаете, что означает. распоряжаетесь как знаете
___}
}

гуры, наверное, против, чтобы вам смотреть такой код, но это 100% сработает. захотите понять как - почитаете книжки. если хотите освоить c#, то без linq, lambda expression и прочего как можно обойтись? привыкайте : )


#54 
maxxxl79 прохожий26.11.17 01:38
NEW 26.11.17 01:38 
в ответ AlexNek 26.11.17 00:52
Может вы еще сможете объяснить необходимость использования nameof в данном конкретном случае?

Что-то категорично говоря про var, Вы не рассматривали конкретные случаи :) Про nameof я не писал про необходимость, Вы невнимательно читаете и дописываете за меня.


Тем что она просто вредна - у нас разрешено использование исключительно String.Format. Догадываетесь отчего?

Не догадываюсь. Поделитесь. Интересно.


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

Спросите у ТС, получил ли он от Ваших сообщений пользу за эти пока ещё три страницы.

#55 
maxxxl79 гость26.11.17 01:40
NEW 26.11.17 01:40 
в ответ moose 26.11.17 01:35, Последний раз изменено 26.11.17 01:58 (maxxxl79)

я тут никого не критиковал за попытку помочь тому, кто просит помощи :) поэтому я не против никаких вариантов решения.


по задаче:

я так понял, что текст

GENERATORS DRIVE DISCONNECT switches GUARD CLOSED

может быть, а может и не быть в начале строки, собственно, поэтому и попросил ТС прояснить этот момент.


а пары как вариант можно вытаскивать ещё регуляркой:


var matches = Regex.Matches(str, @"([\w+\s*\/\[\]]+,\s*\d+)");


выглядит короче, но кое-кто сейчас напишет, что давать код с регулярными выражениями несведущим людям - это хамство )


#56 
  moose старожил26.11.17 10:44
NEW 26.11.17 10:44 
в ответ maxxxl79 26.11.17 01:40

регулярные выражения - это не с#. а linq - плоть от плоти.

#57 
beautiful_man посетитель26.11.17 11:10
NEW 26.11.17 11:10 
в ответ maxxxl79 26.11.17 01:40

ребят, давайте без нравоучений, битте!

написал же уже, целью не является стать профи.

maxxxl79,

спасибо ещё раз, что находишь время для меня,


1. сейчас текстовый файл выглядит так:

BATTERY ON / GUARD_CLOSED,sim/cockpit2/electrical/battery_on[0], 1,laminar/B738/button_switch/cover_position[2], 0,sim/operation/failures/rel_batter[0], 0
STANDBY POWER switch AUTO / GUARD CLOSED,sim/cockpit2/electrical/battery_on[1], 1,laminar/B738/button_switch/cover_position[3], 0,sim/operation/failures/rel_batter1, 0
GENERATORS DRIVE DISCONNECT switches GUARD CLOSED,laminar/B738/one_way_switch/drive_disconnect1_pos, 0,laminar/B738/one_way_switch/drive_disconnect2_pos, 0,laminar/B738/button_switch/cover_position[4], 0,laminar/B738/button_switch/cover_position[5], 0
BUS TRANSFER switch AUTO / GUARD CLOSED,sim/cockpit2/electrical/cross_tie, 1,laminar/B738/button_switch/cover_position[6], 0
GROUND POWER ON,sim/cockpit/electrical/gpu_amps, >0.0,sim/operation/failures/rel_ex_power_on, 0

где:

BATTERY ON / GUARD_CLOSED,
STANDBY POWER switch AUTO / GUARD CLOSED,
GENERATORS DRIVE DISCONNECT switches GUARD CLOSED
BUS TRANSFER switch AUTO / GUARD CLOSED,
GROUND POWER ON,

информационный текст, он прописывается в checkedListBox1 только как информация.

Отделить его можно запятой или другим методом(например ;, -, @, %, &, §, и.т.д)

2. команды находятся после текста:

sim/cockpit2/electrical/battery_on[0], 1,laminar/B738/button_switch/cover_position[2], 0,sim/operation/failures/rel_batter[0], 0
sim/cockpit2/electrical/battery_on[1], 1,laminar/B738/button_switch/cover_position[3], 0,sim/operation/failures/rel_batter1, 0
laminar/B738/one_way_switch/drive_disconnect1_pos, 0,laminar/B738/one_way_switch/drive_disconnect2_pos, 0,laminar/B738/button_switch/cover_position[4], 0,laminar/B738/button_switch/cover_position[5], 0
sim/cockpit2/electrical/cross_tie, 1,laminar/B738/button_switch/cover_position[6], 0
sim/cockpit/electrical/gpu_amps, >0.0,sim/operation/failures/rel_ex_power_on, 0

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

в каждой строчки, один блок команд.

Задача:

1. определить конец каждой строчки, можно отделить каждый блок каким либо символом(например ;, -, @, %, &, §, и.т.д)

Нужно разбить строчку на два блока, отделить информационный текст от команд.

Может быть считать только команды по отдельности и потом связать их вместе?

2. Информационный текст вписать в checkedListBox1

3. Подать команду или блок команд.

4. Поставить галку в checkedListBox1.


Примерно так, думаю сейчас более понятно объяснил.

#58 
  moose старожил26.11.17 13:48
NEW 26.11.17 13:48 
в ответ beautiful_man 26.11.17 11:10
Примерно так, думаю сейчас более понятно объяснил.

что здесь "более понятно", мне непонятно : ( как была каша, так и остается. я бы на вашем месте попытался все таки еще раз задачу внятно сформулировать. вы вещаете так, как будто мы с вами в одной комнате уже месяц находимся, видим, что вы там уже наделали, что уже сделали, какие чембоксы, зачем и пр. а мы ничего не видим и не знаем, кроме того, что вы здесь излагаете.

#59 
maxxxl79 гость26.11.17 13:49
NEW 26.11.17 13:49 
в ответ beautiful_man 26.11.17 11:10, Последний раз изменено 26.11.17 14:04 (maxxxl79)

поменял изначальный пример:

private async void button1_Click(object sender, EventArgs e)
{
var lines = System.IO.File.ReadAllLines(FILE_NAME);


foreach (var line in lines)
{
//получаем текст, исходя из того, что строка должна начинаться с него
var text = line.Split(',')[0];
checkedListBox1.Items.Add(text);//добавляем текст в список
await Task.Delay(500);//дополнительная пауза для наглядности, удалите если не надо


//ищем команды
var matches = Regex.Matches(line, @"([\w+\s*\/\[\]]+,[\s*>?.?\d]+)");
//каждую команду отправляем, не понял, что имеете в виду под отправку всего блока команд - измените как нужно, здесь отправляем каждую команду, которую нашли в строке последовательно
foreach (Match match in matches)
{
var ar = match.Value.Split(',');
SendXPCommand(ar[0].Trim(), ar[1].Trim());//отправляем команду
await Task.Delay(1500);//для той же наглядности увеличенная пауза - поменяете как надо
}
checkedListBox1.SetItemChecked(checkedListBox1.Items.Count - 1, true);//выставляем галку
}
}


private void SendXPCommand(string command, string param)
{
Console.WriteLine($@"{nameof(SendXPCommand)}({command},{param})");
}



#60 
1 2 3 4 5 6 7 все