Ответы пользователя по тегу C#
  • Как сделать эффект бесконечного холста?

    @Sumor
    Берёте канвас размером больше экрана, вплоть до двукратной ширины и высоты.
    При скролировании перемещаете канвас. Как только вы приблизитесь к границе - добавьте с той стороны новый канвас такого же размера. Перемещайте оба канваса пока первый не скроется из виду и вы его можете спокойно удалить.
    При таком подходе достаточно двух канвасов, если у вас перемещается по одной оси, и четырёх, если перемещение по двум осям.
    Ответ написан
    Комментировать
  • Как добавить в индекс массива 2 символа из текст бокса?

    @Sumor
    for (int i=0; i<text.Length; i+=2)
    {
      if(text[i] == ' ') break;
      if(i != text.Length-1)
      {
          sed.Add(byte.Parse(text.Substring(i, 2)));
      }
      else
      {
          sed.Add(byte.Parse(text.Substring(i, 1)));
      }
    }
    Ответ написан
    Комментировать
  • Как сделать Поиск анаграмм в заданном словаре?

    @Sumor
    Простая идея для русского языка.
    Для словаря строите следующий индекс:
    Каждой букве (кроме Е=Ё) ставите в соответствие число: А=0 Б=1 ... Я=31
    Если буква встречается в слове, то взводите соответствующий бит числа (вне зависимости от количества букв)
    В этом случае вам для русского языка хватит UInt32 (unsigned int).
    АБАК = 1000000011

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

    @Sumor
    Всё зависит от степени "уникальности" папок.
    Можно предложить следующий способ:
    Берёте имена файлов, их размеры и даты изменения.
    Сортируете их по имени файла.
    Складываете в один файл/строку и считаете хеш.
    Это будет работать при определённых допущениях: что у вас нет злоумышленника, который подменит содержимое файлов без изменения их размера и даты изменения.
    Ответ написан
    1 комментарий
  • Как создать combobox с кастомными шрифтами в коде?

    @Sumor
    Берёте список FontFamily и присваиваете в Source ComboBox.
    <ComboBox>
      <ComboBox.ItemTemplate>
        <DataTemplate>
          <TextBlock FontFamily="{Binding}" Text="{Binding Name}" />
        <DataTemplate>
      </ComboBox.ItemTemplate>
    </ComboBox>
    Ответ написан
    Комментировать
  • Передача большого файла по UDP - частями?

    @Sumor
    UDP не гарантирует доставку. Пакеты могут потеряться. Пакеты могут прийти в другом порядке.
    Длина файла возможно не будет кратно 8192. В RemoteIpEndPoint возможно ошибка. Брендмауэр возможно включён.
    Ваше ПО должно быть к этому готово.
    Ответ написан
    Комментировать
  • Как перенести форматированный текст из двух RichTextBox в один в C#?

    @Sumor
    Всё достаточно просто. Block может принадлежать только одному тексту. Вы его добавляете в новый текст - и он пропадает из старого. Следующий блок "подвигается" на i-ое место и не попадает в обработку.
    Ответ написан
    1 комментарий
  • Как из символа '\t' получить табуляцию?

    @Sumor
    var sIn = "1 2\t3";		
    // Первый способ
    var sOut1 = new String(sIn.Select(ch => {switch(ch) 
    		{
    			case '\t': return ' ';
    			case '\n': return ' ';
    			default: return ch;
    		}
    			 }).ToArray());
    // Второй способ
    var sOut2 = String.Concat(sIn.Select(ch => {switch(ch) 
    		{
    			case '\t': return ' ';
    			case '\n': return ' ';
    			default: return ch;
    		}
    			 }));

    Хоть это и выглядит очень страшно, но вот мои аргументы:
    - при использовании Replace происходит полный просмотр строки и создание новой строки. При увеличении количества заменяемых символов - увеличивается число просмотров строки:
    "1 2\t3".replace("\t", " ").replace("\n", " "); - два просмотра строки и два создания строки
    "1 2\t3".replace("\t", " ").replace("\n", " ").replace("|", " "); - три просмотра строки и три создания строки
    - в моём варианте, вне зависимости от количества заменяемых символов просмотр строки происходит только один раз, и один раз создаётся строка. Для расширения проверяемых символов - нужно просто добавить case.

    Хотите более понятно, пожалуйста:
    var sIn = "1 2\t3";		
    var sb = new StringBuilder(sIn.Length);
    foreach(var ch in sIn)
    {
      switch(ch) 
      {
        case '\t': 
        case '\n': 
          sb.Append(' ');
          break;
        default: 
          sb.Append(ch);
          break;
      }
    };
    var sOut = sb.ToString();
    Ответ написан
    4 комментария
  • Как подключится к Telnet из C#?

    @Sumor
    Попробуйте вместо
    string response = Encoding.ASCII.GetString(buffer).Trim();

    string response = Encoding.GetEncoding(1251).GetString(buffer).Trim();

    И ещё проблема может быть в том, что консоль, в которой вы выполняете настроена на однобайтную кодировку, а вы через Console.WriteLine выводите unicode.
    Ответ написан
  • C# - как выбрать хранилище данных в памяти?

    @Sumor
    Всё зависит от того, что необходимо.
    Если необходимо просто проводить последовательную обработку, то нужен IEnumerable.
    Если нужно знать заранее количество элементов, то нужен ICollection.
    Если нужна работа доступ по индексам элементов, то нужен IList.
    Если нужна работа по ключам, то нужен IDictionary.
    Если нужно связывание/отработка изменений элементов, то нужны IBindingList или IObservableCollection.
    Это базовые возможности, которые будет наследовать любой класс для хранения элементов. Дальше если важен способ хранения элементов или особенный доступ - выбираете или реализуете класс с нужными интерфейсами и возможностями.
    Базовые классы: массив, List<T>
    Queue<T> - очередь
    Stack<T> - стек
    Dictionary<TK,TV> - словарь
    ObservableCollection<T> - коллекция с поддержкой событий изменения
    Ответ написан
    2 комментария
  • Как правильно читать строки из большого файла?

    @Sumor
    Если планируется одновременная работа с данными, да ещё и их изменение, то лучше рассмотреть вопрос с БД.
    Есть много вариантов простых встроенных в программу движков, которые обеспечат вам корректную одновременную работу с данными.

    Если же хочется поиграться самому, то вот несколько моментов.
    Для одновременной работы из нескольких потоков файл нужно открывать с опциями FileShare.Read или FileShare.ReadWrite. Особенности работы с ними прочитаете сами.
    Удаление данных в начале файла приводит к его полному переписыванию операционной системой. То есть компьютер всё равно прочтёт 600 МБ, просто это будет не в вашем потоке.
    Достаточно быстро просто помечать "удалённые строки" какими-то спецсимволами. Например, вы можете выделить под это первый символ строки. А очистку начала файла производить раз в 100-200-300-500 "удалений".
    При этом, если вы планируете многопоточность, то нужно хорошо организовать их взаимодействие, а то получите дважды обработанные строки.
    Ответ написан
    Комментировать
  • Как вернуть значение из функции?

    @Sumor
    Лучше так:
    class Arrays<T>
        { 
            public T GetValue(int k)
            {
                if (k < 0 || k > array.Length)
                    throw new IndexOutOfRanfeException();
                return (array[k]);            
            }

    Хуже так:
    class Arrays<T> where T : class
        { 
            public T GetValue(int k)
            {
                if (k < 0 || k > array.Length)
                    return null;
                return (array[k]);            
            }

    Ещё хуже так:
    class Arrays<T> 
        { 
            public T GetValue(int k)
            {
                if (k < 0 || k > array.Length)
                    return default(T);
                return (array[k]);            
            }
    Ответ написан
    Комментировать
  • Как отобразить модель видеокарты?

    @Sumor
    Через WMI, примерно так:
    ManagementObjectSearcher searcher 
         = new ManagementObjectSearcher("SELECT * FROM Win32_DisplayConfiguration");
    // или new ManagementObjectSearcher("SELECT * FROM Win32_VideoController");
        string graphicsCard = string.Empty;
        foreach (ManagementObject mo in searcher.Get())
        {
            foreach (PropertyData property in mo.Properties)
            {
               if (property.Name == "Description")
               {
                   graphicsCard = property.Value.ToString();
               }
            }
        }

    В MSDN подробное описание свойств каждого из этих классов.
    Ответ написан
    Комментировать
  • Как создать фоновый процесс со своим названием?

    @Sumor
    Создаёте проект WinForms, удаляете главную форму (Form1.cs), открываете program.cs, удаляете всё из метода Main и пишете туда свой код, как минимум бесконечный цикл:
    public static void  Main()
    {
      while(true)
      {
        Thread.Sleep(100);
      }
    }

    Такое приложение будет висеть в диспетчере задач, но у него не будет окон.
    Для его создания просто нужно выполнить Process.Start("путь к exe");
    Ответ написан
    2 комментария
  • Как создать текстовый редактор в VisualStudio2017?

    @Sumor
    Прекрасная статья на Хабре о внутреннем устройстве текстовых редакторов:
    Текстовый редактор — это вам не высшая математика,...
    Ответ написан
    Комментировать
  • Парсинг html с помощью c# стандартных инструментов?

    @Sumor
    Если у вас правильный html с закрывающимися тегами, то можно попробовать через XDocument или XElement
    Условно, где-то так:
    var xEl = XElement.Parse("<div style=\"font-family: 'Courier New', Courier, monospace; font-weight: normal\">Hello word</div>");
    Console.WriteLine((string)xEl);

    Там же можно воспользоваться XPath. Где-то так:
    var xDoc = XDocument.Parse("<div><div class='c1'>c1</div><div class='c2'>c2</div><div class='c3'>c3</div></div>");
    
    string xPath = "//div[@class='c1']";
    
    foreach (var xElement in xDoc.XPathSelectElements(xPath))
    {
    	Console.WriteLine((string)xElement);
    }
    Ответ написан
    1 комментарий
  • C#. Как получить имя подпапки в реестре?

    @Sumor
    GetSubKeyNames возвратит имена всех подразделов. Выбираете нужный и отрываете.
    OpenSubKey может сразу открыть путь:
    Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop\PerMonitorSettings",true)
    Ответ написан
    Комментировать
  • Как парсить текст в CSV формате игнорируя запятые внутри кавычек и без сторонних библиотек?

    @Sumor
    По мотивам ответа mefutu
    Примерное решение на конечном автомате:
    using System;
    using System.Text;
    using System.Collections.Generic;
    					
    public class Program
    {
    	public static void Main()
    	{
    		Console.WriteLine(string.Join("|", Parse("Мама,\"мыла, блин\", раму,\"мама, мыла \"\"раму\"\"\",конец")));
    	}
    	
    	public enum StateEnum{Start, StartQuot, Inline, InlineQuot}
    	
    	public static IEnumerable<string> Parse(string str)
    	{
    		var state = StateEnum.Start;
    		var sb = new StringBuilder();
    		foreach(var ch in str)
    		{
    			switch(ch)
    			{
    				case '"':
    					switch(state)
    					{
    						case StateEnum.Start:
    							state = StateEnum.StartQuot;
    							continue;
    						case StateEnum.StartQuot:
    						case StateEnum.InlineQuot:
    							state = StateEnum.Inline;
    							sb.Append('"');
    							continue;
    						case StateEnum.Inline:
    							state = StateEnum.InlineQuot;
    							continue;
    					}
    					break;
    				case ',':
    					switch(state)
    					{
    						case StateEnum.Start:
    						case StateEnum.InlineQuot:
    							yield return sb.ToString();
    							sb.Clear();				
    							state = StateEnum.Start;
    							continue;
    						case StateEnum.StartQuot:
    						case StateEnum.Inline:
    							sb.Append(',');
    							state = StateEnum.Inline;
    							continue;						
    					}
    					goto default;
    				default:
    					sb.Append(ch);
    					break;
    			}
    		}
    		yield return sb.ToString();
    	}
    }
    Ответ написан
    Комментировать
  • По какой причине UdpClient.Send() иногда кидает исключение?

    @Sumor
    Размер UDP данных не может превышать 65507 байт: 65535 байт на пакет, из них 20 байт заголовок IP, 8 байт заголовок UDP.
    У вас верхний предел 100000. Поэтому как только случайное число становится больше 65507 возникает ошибка.
    Ответ написан
  • Почему UdpClient.Reсeive() не теряет пакеты?

    @Sumor
    У UdpClient есть буфер, в который складываются полученные данные.
    Размер его доступен (get set) в свойстве ReceiveBufferSize.
    Если данные приходят, а вы их не прочитали, то данные по кругу затираются - то есть происходит потеря пакетов.
    Ответ написан