Однотипные строки в цикл

Автор Тема: Однотипные строки в цикл  (Прочитано 26876 раз)

0 Пользователей и 3 Гостей просматривают эту тему.

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 393
  • Карма: 21
Re: Однотипные строки в цикл
« Ответ #45 : 30-10-2019, 20:51:52 »
Lemieux,
Кстати, ты обратил внимание что в этом списке есть не только строки, но и Autodesk.AutoCAD.Runtime.LispDataType.ListBegin и Autodesk.AutoCAD.Runtime.LispDataType.ListEnd (это как скобки в lisp)? У них TypeCode 5016 и 5017
Да, я знаю об этом, поэтому у меня перебор массива начинается не с "0" элемента, а с "1" и заканчивается на "*.length-1". А есть какое решение как более изящно избавиться от обозначения границ списка?
PS Я с .ListStart и .ListEnd сталкивался, когда изучал ResultBuffer. Да и при отладке видно, что при передаче списка, размером 3, пишет "TypedValue[5]". Кстати, благодаря тому, что в Visual Studio, при отладке, удобно сделано, что показывает значение переменной и можно посмотреть, что там внутри, я решил вот так преобразовать тип.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Однотипные строки в цикл
« Ответ #46 : 30-10-2019, 20:55:06 »
А есть какое решение как более изящно избавиться от обозначения границ списка?
Вполне изящное решение если ты уверен, что у тебя в переменной обычный линейный список строк.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Re: Однотипные строки в цикл
« Ответ #47 : 30-10-2019, 21:03:02 »
Впрочем возможен вариант, что в этой переменной не список и тогда преобразовывать в TypedValue[] нельзя.
Правильнее вот так:

Код - C# [Выбрать]
  1. [CommandMethod("GetLispVar")]
  2. public void GetLispVar()
  3. {
  4.   Document doc = Application.DocumentManager.MdiActiveDocument;
  5.   if (doc == null) return;
  6.  
  7.   Editor ed = doc.Editor;
  8.   PromptResult rs =  ed.GetString("\nУкажите имя переменной: ");
  9.   if (rs.Status == PromptStatus.OK)
  10.   {
  11.     var o = doc.GetLispSymbol(rs.StringResult);
  12.     if (o != null && o is TypedValue[])
  13.     {
  14.       TypedValue[] tvs = o as TypedValue[];
  15.       foreach (TypedValue tv in tvs)
  16.       {
  17.         ed.WriteMessage($"\n{tv.TypeCode} - {tv.Value}");
  18.       }
  19.     } else
  20.     {
  21.       ed.WriteMessage($"\n{o}");
  22.     }
  23.   }
  24. }
В C# не-помню-какой-версии добавили удобную проверку типа с одновременным преобразованием.
Поэтому, вместо строк 12-14 можно написать:
Код - C# [Выбрать]
  1. if (o is TypedValue[] tvs)
  2. {

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Однотипные строки в цикл
« Ответ #48 : 30-10-2019, 21:08:21 »
В C# не-помню-какой-версии
Добавили в C# 7.0. Но я консервативен и использую старый синтаксис :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение