Replies (36)
- @0xd34df00d:@jtootf if (!somedict.contains (key))
{
var ctrl = new ...
}
var ctrl = somedict[key];
Матерится. А схренали матерится? Чтобы индус-идиот не отстрелил себе ногу? - @jtootf:@0xd34df00d а если тернарным оператором с одним объявлением ctrl?
- @0xd34df00d:@jtootf В if еще строк 10 по инициализации этого ctrl.
- @jtootf:@0xd34df00d вынести объявление, а по if/else провести только инициализацию? если иметь невалидный ctrl недопустимо, можно инициализацию выполнять во временную переменную, и затем просто закинуть значение в ctrl. какой, кстати, срок жизни в C# у переменной, объявленной внутри блока?
- @0xd34df00d:@jtootf Так и сделал в итоге. Но черезжопиё же.
- @jtootf:@0xd34df00d твой вариант тоже, строго говоря, черезжопиё: зачем тебе два (в случае успеха предиката в if) объявления одной переменной? also, ты там else нигде не потерял?
- @0xd34df00d:@jtootf Так и сделал \equiv var ctrl; if (...) { ctrl = new ..; } ctrl = dict[key];
- @jtootf:@0xd34df00d ещё раз — ты точно не потерял там else? потому как теперь у тебя по успешному if будет две инициализации, причём одна ошибочная
- @0xd34df00d:@jtootf Почему ошибочная? Это код открытия таба. Есть инициализация, которая должна выполняться только при создании контрола, то бишь, первом открытии таба, (делегаты навесить, Сцинтиллу проинициализировать, добавить в мапу IProjectEntry -> ScintillaEditorInstance), а есть — которая всегда (при любом последующем). Загрузить текст в сцинтиллу и сделать Modified = false, например.from idead, 17 months ago, in reply to /9
- @jtootf:@0xd34df00d в случае, если в словаре такого значения нет, ты инициализируешь ctrl некоторыми данными (затем, надо полагать, вносишь его в словарь), и затем снова инициализируешь его выбранным из словаря значением. зачем дважды его инициализировать?from galois, 17 months ago, in reply to /10
- @0xd34df00d:@jtootf Да, ессно, вношу в словарь. Затем — для большей читабельности имхо. Конечно, если поставить else, то ничего не изменится, но блин, по мне так читабельнее )
Слушай, а как обойти коллекцию, меняя ее?from idead, 17 months ago, in reply to /11 - @jtootf:@0xd34df00d а можно весь этот кусок кода? я не понимаю твоей логики вообще. что касается обхода коллекции — смотря какая коллекция; список, например, не инвалидирует итераторыfrom galois, 17 months ago, in reply to /12
- @0xd34df00d:@jtootf System.Windows.Controls.ItemCollection (TabControl.Items из WPF).
Кусок, скорее всего нет, таки проект весьма закрыт.from idead, 17 months ago, in reply to /13 - @jtootf:@0xd34df00d ок. но логика от наличия/отсутствия else там меняется, чтоб я сдохfrom galois, 17 months ago, in reply to /14
- @vannadiz:@0xd34df00d не выдать кусок кода на 10 строк даже очень закрытого проекта — смешно.
А так у тебя действительно не понятно, что ты хочешь и нафига ты делаешь то, что ты делаешь.from web, 17 months ago, in reply to /14 - @jtootf:@0xd34df00d ItemCollection заявлен реализующим IList, т.е. он должен позволять обход с изменением элементов. под рукой, к сожалению, компилятора нет, но если надо — могу поставить и поигратьсяfrom galois, 17 months ago, in reply to /14
- @0xd34df00d:@jtootf Оно мне экзепшн выдало, чо. Олсо, там изменение более глобальное, с удалением элементов по ходу.from idead, 17 months ago, in reply to /18
- @0xd34df00d:@vannadiz
public TabItem GetControlForEntry(IProjectEntry entry)
{
var ctrl;
if (!_Entry2Tab.ContainsKey(entry))
{
ctrl = new ScriptEntries.ScriptEntryControl();
ctrl.Edit.ConfigurationManager.Language = "js";
ctrl.Edit.Tag = entry;
ctrl.Edit.ModifiedChanged += new EventHandler(Edit_ModifiedChanged);
var result = new TabItem();
result.Header = entry.Name;
result.Content = ctrl;
_Entry2EditorCtrl[entry] = ctrl;
_Entry2Tab[entry] = result;
}
ctrl = _Entry2EditorCtrl[entry];from idead, 17 months ago, in reply to /16 - @vannadiz:@0xd34df00d 0_о так ты присваиваешь переменной значение, которое она уже содержитfrom asylum, 17 months ago, in reply to /20
- @0xd34df00d:@vannadiz Более того, оно то же. Я решил не писать «лишний» else.from idead, 17 months ago, in reply to /21
- @vannadiz:@0xd34df00d это ж Г, прости. Это всю логику портит.from asylum, 17 months ago, in reply to /22
- @jtootf:@0xd34df00d на удаление в списке пофиг — это ж не последовательностьfrom galois, 17 months ago, in reply to /19
- @0xd34df00d:@vannadiz Щито? Почему? Мы вон его двумя строками перед этим запихнули в словарь, а щас оттуда достаем. Почему что-то изменится от else?from idead, 17 months ago, in reply to /23
- @jtootf:@0xd34df00d потому что в случае else ты один раз инициализируешь переменную. один раз. тот факт, что два последовательных присваивания работают как одно, не очевиден и как минимум нуждается в документированииfrom galois, 17 months ago, in reply to /25
- @0xd34df00d:@jtootf Хорошо, а здесь?
if (!_EntryTabs.Items.Contains(it))
{
it.Tag = entry;
_EntryTabs.Items.Add(it);
}
int idx = _EntryTabs.Items.IndexOf(it);from idead, 17 months ago, in reply to /26 - @vannadiz:@jtootf во-первых, это как минимум неоптимизировано. Тут это не критично, но в случае более сложных структур итп достаточно ощутимо. Во-вторых, это неочевидно программисту. Я минут 5 втыкала в код в 10 строчек, потому что не могла понять, зачем там одно и тоже делается и в чем фишка. В третьих, чисто по логике, если мы не нашли значение — проинициализировали, если нашли — взяли.from asylum, 17 months ago, in reply to /26
- @0xd34df00d:@vannadiz На оптимальность подобного ветвления я какбе забил, ибо там строкой ниже IO, например.
Насчет очевидности — ну вот хз. У меня, видимо, слегка по-другому мозги работают )from idead, 17 months ago, in reply to /28 - @0xd34df00d:@jtootf А чо с коллекцией делать? Не ручками же с конца проходить?from idead, 17 months ago, in reply to /29
- @jtootf:@0xd34df00d надо документацию смотреть. я очень давно не работал с C# и у меня нет под рукой компилятора, увыfrom galois, 17 months ago, in reply to /31
- @0xd34df00d:@jtootf Collection was modified; enumeration operation may not execute. kekeke. Ладно, пойду погуглю чо. Тут linq в соседнем окне посоветовали.from idead, 17 months ago, in reply to /32
- @jtootf:@0xd34df00d LINQ это монады, LINQ это ок; но вообще говоря чудес он делать не долженfrom galois, 17 months ago, in reply to /33
- @vannadiz:@0xd34df00d это было бы очевидно, если бы проинициализировал чисто _Entry2EditorCtrl[entry], если его не найдено, а потом уже делал ctrl = _Entry2EditorCtrl[entry]; То есть если оно не найдено — инициализируем. А уже потом чему угодно присваиваем существующее значение.from asylum, 17 months ago, in reply to /30
- @vannadiz:@0xd34df00d мы сейчас сошлись с @jtootf, что ctrl в условии надо заменить на temp. Это будет слегка неоптимизировано, но зато красиво и читабельно.from asylum, 17 months ago, in reply to /20