Ответы пользователя по тегу C#
  • Как спарсить весь html код - C#?

    Gorily
    @Gorily
    Метод 1. Качественно, но сложно.
    Подгрузка контента происходит обычно GET-запросами с параметрами, где указаны параметры сколько статей с начала пропустить и по сколько получать. В ответе обычно прилетает готовый HTML код, который просто встраивается в страницу и его спокойно можно распарсить.
    Вектор для изучения:
    • WebClient, HttpClient и т.п. - для формирования запросов
    • Консоль разработчика браузера (Shift+Ctrl+i, вкладка Network) и Fiddler - для изучения поведения страницы и вылавливания содержимого запроса
    Метод 2. Быстро и без заморочек.
    Взять Selenium + Chrome (для наглядности), открывать в них страницу и эмулировать стандартными средствами либо нажатие кнопки (например, "Показать ещё"), либо нажатие пробела (пролистывает страницу вниз). Время от времени проверять используя XPath достигнуто ли дно.
    Вектор для изучения:
    • Selenium - статей полно
    • XPath - язык запросов к XML подобной разметке


    Оба пути очень доступные в изучении.
    Ответ написан
    Комментировать
  • Как отрисовать html код из строки в WPF-приложении?

    Gorily
    @Gorily
    Верно ли я вас понял: программа запрашивает некую страницу (запрос), результаты возвращаются в виде HTML строки. Ваша задача - красиво отобразить элементы в WPF приложении.
    Варианты:
    • Отобразить содержимое строки в WebBrowser:
      var browser = new System.Windows.Controls.WebBrowser();
      browser.NavigateToString(string strHtml);

    • Использовать конвертер во FLOWDOCUMENT, подробно тут: blogs.spencen.com/?p=672
    • Можно также воспользоваться любым HTML парсером, например Html Agility Pack и вручную пройтись по элементам кода, попутно создавая элементы интерфейса:
      var doc = new HtmlDocument();
      doc.LoadHtml(html);

    Ответ написан
    Комментировать
  • Как свернуть процесс в трей на C#?

    Gorily
    @Gorily
    var driver = new ChromeDriver();
    driver.Manage().Window.Minimize();
    Ответ написан
    Комментировать
  • Как автоматически получить транскрипцию английского слова из Яндекс-переводчика?

    Gorily
    @Gorily
    Сразу предупреждаю: вы должны понимать, что нарушаете правила пользования сервисами Яндекса и ни в коем случае не должны использовать такие решения в коммерческих целях. Надеюсь на ваше благоразумие.

    По поводу решения: лучше зайти со стороны внутреннего API, используемого на сайте.
    Вот простейший вариант решения. Для парсинга Json используется библиотека Json.Net (можете переписать на парсинг стандартной библиотекой .Net, мне просто так было быстрее написать пример).
    const string text = "dog";
    var translateUrl = "https://dictionary.yandex.net/dicservice.json/lookup?ui=ru&text="
                        + text + "&lang=en-ru&flags=23";
    
    using (var wc = new WebClient())
    {
        wc.Encoding = Encoding.UTF8;
        var resultHtml = wc.DownloadString(translateUrl);
        dynamic trsJson = JObject.Parse(resultHtml);
    
        var trs = trsJson.def[0].ts;
        Console.WriteLine("Транскрипция: " + trs);
    }
    Ответ написан
    Комментировать
  • Как увеличить Timeout сокета библиотеки?

    Gorily
    @Gorily
    Вот обсуждение на GitHub: https://github.com/andyedinborough/aenetmail/issues/80
    Почитайте, попробуйте пример оттуда, переделав под IMAP:
    var fromAddress = new MailAddress(from);
    var toAddress = new MailAddress(to);
    var smtp = new SmtpClient
    {
    Host = "smtp.gmail.com",
    Port = 587,
    Timeout = -1,
    EnableSsl = true,
    DeliveryMethod = SmtpDeliveryMethod.Network,
    UseDefaultCredentials = false,
    Credentials = new NetworkCredential(fromAddress.Address, frompw)
    };
    using (var message = new MailMessage(fromAddress, toAddress)
    {
    Subject = subject,
    Body = body
    })
    {
    smtp.Send(message);
    }
    Ответ написан
    Комментировать
  • "Всего 12 анкет" - замена окончания слова "анкет" в зависимости от цифры. Есть готовые решения?

    Gorily
    @Gorily
    Пользуюсь таким решением:
    /// <summary>
    ///     Склонение существительных после числительных.
    /// </summary>
    /// <param name="iNumber">Число</param>
    /// <param name="aEndings">Массив слов или окончаний для чисел (1, 4, 5)</param>
    /// <returns>Вовращает вариант окончания или слова для числительного</returns>
    public static string GetNumEnding(long iNumber, string[] aEndings)
    {
    	string sEnding;
    	iNumber = iNumber%100;
    	if (iNumber >= 11 && iNumber <= 19)
    	{
    		sEnding = aEndings[2];
    	}
    	else
    	{
    		var i = iNumber%10;
    		switch (i)
    		{
    			case (1):
    				sEnding = aEndings[0];
    				break;
    			case (2):
    			case (3):
    			case (4):
    				sEnding = aEndings[1];
    				break;
    			default:
    				sEnding = aEndings[2];
    				break;
    		}
    	}
    	return sEnding;
    }

    Пример:
    GetNumEnding(notices.Count, new[] {"объявление", "объявления", "объявлений"})
    Ответ написан
    1 комментарий
  • Как сравнить два List?

    Gorily
    @Gorily
    Я бы сделал как-то так:
    private static void Main()
            {
                var list1 = new List<DB>
                {
                    new DB {vopros = "1", url = "11"},
                    new DB {vopros = "2", url = "22"},
                    new DB {vopros = "3", url = "33"}
                };
                var list2 = new List<DB>
                {
                    new DB {vopros = "2", url = "66"},
                    new DB {vopros = "3", url = "55"},
                    new DB {vopros = "5", url = "44"}
                };
    
                var except = list1.Except(list2, new DBComparer());
                var except1 = list2.Except(list1, new DBComparer());
            }
    
            public class DB
            {
                public string vopros { get; set; }
                public string otvet { get; set; }
                public string url { get; set; }
            }
    
            public class DBComparer : IEqualityComparer<DB>
            {
    
                public bool Equals(DB x, DB y)
                {
                    if (ReferenceEquals(x, y)) return true;
                    return x != null && y != null && x.vopros.Equals(y.vopros);
                }
    
                public int GetHashCode(DB obj)
                {
                    return obj.vopros == null ? 0 : obj.vopros.GetHashCode();
                }
            }
    Ответ написан
    Комментировать
  • Структура файлов в MvvmLightToolkit?

    Gorily
    @Gorily
    Я когда пришел к идее использовать в проекте MVVM (при этом опыт C# у меня уже был приличный), задал здесь вопрос: Базовый экскурс в MVVM Light Toolkit от практикующих
    Большое спасибо Павел Осадчук за ответ там, на базе его проекта быстро въехал в концепцию и использовал её в паре проектов.
    Когда начнёшь понимать, как и что работает и твой проект будет разрастаться, то возникнет много вопросов: как работать с модальными окнами, относится это к view или model и пр. Тогда вы начнёте искать решения по каждому вопросу отдельно и постепенно решать их. И уже потом вы поставив MvvmToolkit будете радоваться, что большая часть проблем уже решены :)
    Начните с простого.
    Ответ написан
    Комментировать
  • Какаую библиотеку использовать для работы с IMAP?

    Gorily
    @Gorily
    ImapX неплохая библиотека, богатая документация: imapx.codeplex.com

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

    Конечно, структура папок то у всех разная, разные сервисы опять же по разному подходят к хранению. Подключаетесь - получаете структуру каталогов (если не реализовано в библиотеке явно, то через рекурсию) - запрашиваете письма.
    Вот пример для ImapX: stackoverflow.com/questions/5416018/how-to-get-all...
    Ответ написан
    2 комментария
  • Регулярное выражение для разделения слова с цифрой. Из "Привет1234" нужно получить 2 совпадения Привет и 1234. Знает кто как?

    Gorily
    @Gorily
    Тестировать лучше тут: regexstorm.net/tester, у вас же C#?
    Для решения нужно просто найти стыки вида "не цифра-цифра", регулярка простейшая:
    ([\D])([\d])
    Затем делаем замену на:
    $1 $2
    И получаем искомый пробел.
    b74421bd9ee34fd6bddb9e10a47b5559.png
    Ответ написан
    1 комментарий
  • Как объединить несколько листов Excel файла в один?

    Gorily
    @Gorily
    Раньше работал с документами через Microsoft.Office.Interop.Excel, мне не понравилось. На каждый документ по экземпляру Excel в памяти, всё туго ворочается, непонятные ошибки.
    Сейчас использую EPPlus, мне хватает с головой. Посмотрите тут: https://epplus.codeplex.com/, https://github.com/ylatuya/EPPlus
    Примеры тут: https://epplus.codeplex.com/wikipage?title=FAQ&ref...
    Библиотека интуитивно понятная.
    Ответ написан
    Комментировать
  • Htmlagility получить li class?

    Gorily
    @Gorily
    Попробуйте так:
    ("//li[contains(@class,'list-item-180')]")
    Ответ написан
    Комментировать
  • Как создать динамический класс по десериализованному XML или JSON в C#?

    Gorily
    @Gorily
    Отвечу за JSON. Если я всё правильно понял, то я это делаю с помощью Json.NET таким способом:
    dynamic parse = JObject.Parse(rawString);

    По XML вот stackoverflow.com/questions/13171525/converting-xm... и вот: stackoverflow.com/questions/13704752/deserialize-x...
    Ответ написан
    Комментировать
  • Перегрузки методов без дублирования кода в C#?

    Gorily
    @Gorily
    В случаях, когда код это позволяет, можно вынести основной функционал в один из методов (базовый для вас) и вызывать его из других перегрузок:
    string GenerateText(string text)
    {
     return GenerateText(text, "Без заголовка");
    }
    
    string GenerateText(string title, string text)
    {
     return title + Environment.NewLine + text;
    }

    Можно использовать необязательные аргументы, они как раз должны хорошо подойти в случае 1-3 различающихся параметров:
    string GenerateText(string title, string text = "Без заголовка")
    {
     return title + Environment.NewLine + text;
     }

    Никто не может запретить вам передавать вместо не используемых аргументов null и обрабатывать в коде:
    string GenerateText(string title, string text)
    {
     return title + Environment.NewLine + (text ?? "Без заголовка");
    }

    А в случае неопределённого числа однотипных аргументов используем params:
    string GenerateText(string title, params string[] text)
    {
     return title + Environment.NewLine + string.Join(Environment.NewLine, text);
    }

    Комбинируйте этот базовый набор и его должно быть вполне достаточно для аккуратного кода. И само собой, выделяйте повторяемый функционал в методы и классы для последующего повторного использования.
    Ответ написан
    Комментировать
  • Как обработать HTML на С# без htmlagilitypack?

    Gorily
    @Gorily
    Загружаем страницу как то так:
    HttpClient client = new HttpClient();
    var html = await client.GetStringAsync("http://example.com");
    Далее:
    1. Можно попробовать работать со страницей как с XML. Подходит не во всех случаях.
    2. Регулярные выражения.
    3. Как ни странно, можно использовать HtmlAgilityPack, библиотека может быть использована на WP. Не знаю, почему стоит задача решить вопрос именно без неё, так что приведу пример:
    var parsedHtml = new HtmlAgilityPack.HtmlDocument();
    parsedHtml.LoadHtml(html);
    Ответ написан
    1 комментарий
  • Как отлавливать перемещение одного окна над другим?

    Gorily
    @Gorily
    Можно реализовать в своей программе похожий эффект с помощью TabControl.
    Вот посмотрите реализацию на анимации в начале страницы: dragablz.net
    Вообще гуглится по запросу "wpf chrome like tabs".
    Ответ написан
    5 комментариев
  • Отслеживание изменений контента сайта. (C#)

    Gorily
    @Gorily
    Очень интересный вопрос. Вы пытаетесь сделать определение для любого сайта или конкретного? Если у любого, то некоторый блок на странице или вся страница?
    Сразу всплывающие подводные камни:
    1. Как быть с сайтами, где контент подгружается динамически (Ajax)?
    2. Если на странице есть вывод текущего времени или зависимого от него состояния (например: "написано 10 минут назад") - это считается изменением или нет? Если нет, то как универсально отслеживать и игнорировать?
    и т.д.
    Или вы просто в курсовой описываете все возможные алгоритмы? Если так, то вам бы посмотреть в сторону алгоритмов работы кэш серверов.
    Ответ написан
    2 комментария
  • Узнать параметр запуска приложения?

    Gorily
    @Gorily
    Уточните: вам нужно узнать параметры с которыми можно запустить среду разработки LightSwitch или узнать параметры, с которыми было запущено приложение, написанное на LightSwitch? Или, может, вам нужно узнать, как с параметрами запустить созданное приложение из среды LightSwitch?
    Ответ написан
    2 комментария
  • Какие существуют бесплатные .NET библиотеки для распознавания штрих-кодов?

    Gorily
    @Gorily
    Вы просто коллекционируете или пользоваться собираетесь?
    Вы все известные уже перечислили, но не пояснили, чем конкретно они не устраивают.
    Та же ZXing, которую я хотел посоветовать - чего вам в ней не хватает?
    Ответ написан
    Комментировать