Блог про ZennoPoster от volody00

volody00

Client
Регистрация
06.09.2016
Сообщения
929
Благодарностей
1 019
Баллы
93
Раз в неделю буду выкладывать небольшие видео про ZennoPoster.

Подписывайтесь также в телеграмм канал - https://t.me/zennovolody00
 
  • Спасибо
Реакции: ZennoCat и Dmitriy Ka

volody00

Client
Регистрация
06.09.2016
Сообщения
929
Благодарностей
1 019
Баллы
93

volody00

Client
Регистрация
06.09.2016
Сообщения
929
Благодарностей
1 019
Баллы
93
Решил я тут поизучать конкретные классы из .Net Framework, но не знаю, надолго ли меня хватит. Довольно скучно, долго и непонятно, где применять большую часть методов / свойств.

Начал я с класса String - https://learn.microsoft.com/en-us/dotnet/api/system.string?view=net-8.0 . Да, по сути пересказ справки (возможны неточности), но сильно урезанный, на русском и примеры адаптированы под зеннопостер.

Все эти методы вы можете использовать для своих "зенковских переменных" используя project.Variables["имя_переменной"].Value


Методы (часть 1)

public object Clone() – метод Clone() для строк возвращает ссылку на тот же объект, а не создаёт независимую копию. По сути вот эти два подхода будут одинаковы:

C#:
//1 подход
string str1 = "строка 1";
string str2 = str1.Clone().ToString();
str2 = "12345";
project.SendInfoToLog(str1); //строка 1 (не изменилась, хоть и ссылается на тот же объект)

//2 подход
string ostr1 = "строка 2";
string ostr2 = ostr1;
public static int Compare (…)– метод позволяет сравнивать две строки. Много нюансов, много перегрузок. Сравнение идёт по символам. Там учитывается их расположение в Unicode (https://en.wikipedia.org/wiki/List_of_Unicode_characters), регистр и др. https://learn.microsoft.com/en-us/dotnet/api/system.string.compare?view=net-8.0
C#:
string str1 = "hello";
string str2 = "Hello";
int result = string.Compare(str1, str2, true);
project.SendInfoToLog(result.ToString()); //0 , т.к. игнорируем регистр

result = string.Compare(str1, str2, false);
project.SendInfoToLog(result.ToString()); //-1, несмотря на то, что h имеет большее число чем H. Если не ошибаюсь, то заглавные буквы считаются большими чем строчные
public int CompareTo (string str) – сравнение двух строк исключительно по "весу" в таблице Unicode. Берется по одному символу. Если они одинаковы (вес равен) берется следующий и сравнивается.
C#:
string str1 = "hello";
string str2 = "Hdfhdfhdfhfdh";

int result = str1.CompareTo(str2);
project.SendInfoToLog(result.ToString()); //1, т.к. h имеет большее число по unicode чем H
public static int CompareOrdinal (string str1, string str2) – разница в весах по таблице Unicode

C#:
string str1 = "hello";
string str2 = "Hdfhdfhdfhfdh";

int result = string.CompareOrdinal(str1, str2);
project.SendInfoToLog(result.ToString()); //32, т.к. разница между h и H по unicode будет 32. остальные символы игнорируются
public static string Concat (…) – объединяет строки. Можно передать строки (до 4 шт), object (до 4 шт), массив, список (любого типа).
C#:
string result1 = string.Concat(new string[] {"1", "2", "3"});
string result2 = string.Concat(new object[] {"123", 123, true});

object o1 = 123;
object o2 = "123";
string result3 = string.Concat(o1, o2);

List<int> list = new List<int>() {
            123,
            456,
            789
};
string result4 = string.Concat(list); //123456789
public bool Contains (…) – содержится ли указанное значение в строке. можно проверять строку или символ
C#:
string s1 = "The quick brown fox jumps over the lazy dog";
string s2 = "fox";
StringComparison comp = StringComparison.Ordinal;
bool b = s1.Contains(s2);
char symb = '&';
bool bb = s1.Contains(symb);
public static string Copy (string str) – создает независимую копию строки. Не рекомендуется к использованию
C#:
string sourceString = "Hello, World!";
string copy = string.Copy(sourceString);
return copy;
public void CopyTo (int sourceIndex, char[] destination, int destinationIndex, int count) - метод позволяет вытащить какой-то кусок из строки и поместить в массив символов
C#:
string sourceString = "Hello, World!";
char[] destinationArray = new char[20];

sourceString.CopyTo(7, destinationArray, 2, 5); //с какого символа копируем в исходной строке, куда помещаем результат, куда вставляем результат (с какого индекса), сколько копируем из исходной строки
foreach(var s in destinationArray)
{
            project.SendInfoToLog(s.ToString());
}
[1 перегрузка] public bool EndsWith (string value, bool ignoreCase, System.Globalization.CultureInfo? culture) – заканчивается ли строка указанным значением. Параметры: искомое значение, игнорировать ли регистр, Culture Info

[2 перегрузка] public bool EndsWith (string value, StringComparison comparisonType)

[3 перегрузка] public bool EndsWith (string value)
C#:
string msg1 = "Search for the target string";
bool result1 = msg1.EndsWith("string");
bool result2 = msg1.EndsWith("STRING", true, CultureInfo.CurrentCulture);
bool result3 = msg1.EndsWith("asdf", StringComparison.CurrentCulture);

project.SendInfoToLog($"{result1.ToString()}\n{result2.ToString()}\n{result3.ToString()}");
Класс CultureInfo учитывает специфику конкретной страны / языка. Про CultureInfo- https://learn.microsoft.com/en-us/dotnet/fundamentals/runtime-libraries/system-globalization-cultureinfo

public bool StartsWith (…) – аналогично методу EndsWith(…), только поиск идет в начале строки.

Equals(…) - сравнивает строки. Можно передать string, object, указать StringComparison
C#:
StringBuilder sb = new StringBuilder("abcd");
string str1 = "abcd";
string str2 = "abcd";
object o2 = "abcd";

bool result1 = str1.Equals(sb); //False
bool result2 = str2.Equals(o2); //True
public static string Format (…) – позволяет преобразовать строку в указанном формате. Им активно пользовались раньше. Сейчас же обычно используют интерполяцию строк. Но здесь больше настроек. Пример использования

C#:
string result = string.Format("Имя нашего персонажа {0}, а фамилия {1}", str1, str2);
return result;
Мы можем вставлять не только строки, но и другие базовые типы

double d = 2.05;
bool b = true;
string str = string.Format("это double {0}, а это bool {1}", d, b);
return str;
Можно добавить пробелов к началу строки. Для этого надо посчитать длину строки и к этому числу прибавить столько пробелов, сколько нам нужно
C#:
string str = "Вася Пупкин пошёл гулять"; //длина строки 24 символа
string result = string.Format("результат: {0, 30}", str); //добавим 6 пробелов в начало строки
return result;
Можно преобразовывать числовые типы и DateTime с помощью форматных спецификаторов. Почитать какие они бывают можно тут
C#:
double d = 1.05;
string result = string.Format("результат: {0:p}", d);
return result; //105, 00%
Можно использовать CultureInfo для задания нужного формата конкретного языка
C#:
DateTime now = DateTime.Now;
CultureInfo cultureUs = new CultureInfo("en-US");
CultureInfo cultureRu = new CultureInfo("ru-Ru");

string resultUs = string.Format(cultureUs, "время для en-us: {0}", now);
project.SendInfoToLog(resultUs); // время для en-us: 7/12/2024 8:20:40 AM

string resultRu = string.Format(cultureRu, "время для ru: {0}", now);
project.SendInfoToLog(resultRu);  // время для ru: 12.07.2024 8:20:40
public CharEnumerator GetEnumerator () – возвращает объект CharEnumerator. Это своего рода коллекция, где для перехода к следующему элементу надо использовать метод MoveNext()
C#:
string str = "вася";
CharEnumerator ch = str.GetEnumerator();

//принцип работы
ch.MoveNext(); //переходим к первому элементу в коллекции
project.SendInfoToLog(ch.Current.ToString()); //в
project.SendInfoToLog(ch.Current.ToString()); //в

ch.MoveNext(); //теперь к следующему
project.SendInfoToLog(ch.Current.ToString()); //а

//метод reset() сбрасывает действие метода MoveNext() и возвращает нас к началу
ch.Reset();

//пример перебора в цикле
while (ch.MoveNext())
{
            project.SendInfoToLog(ch.Current.ToString()); //будет выводить по одному символу за круг, пока не пройдется по всем
}

//высвобождаем память (может и необязательно хз)
ch.Dispose();

//теперь наш ch уже не существует
try {
            ch.MoveNext();
}
catch{
            project.SendInfoToLog("ошибка, т.к. мы его уничтожили");
}
public static int GetHashCode() - получает hash code элемента. hash code представляет собой числовое значение, которое вычисляется на основе содержимого объекта и служит для быстрого сравнения объектов или для использования в коллекциях

C#:
string str = "вася";
int result = str.GetHashCode();
return result;
public TypeCode GetTypeCode () – возвращает перечисление TypeCode, позволяющее понять нам, с каким типом данных мы работаем.Может быть полезно, если метод в качестве параметра принимает object, и мы точно не знаем, какой тип будет в него передан.
C#:
string str = "вася";
TypeCode tc = str.GetTypeCode();
project.SendInfoToLog(tc.ToString()); //String

dynamic eks1 = "петя";
TypeCode eks1Tc = eks1.GetTypeCode();
project.SendInfoToLog(eks1Tc.ToString()); //String

var eks2 = "петя";
TypeCode eks2Tc = eks2.GetTypeCode();
project.SendInfoToLog(eks2Tc.ToString()); //String
 
  • Спасибо
Реакции: Денчик и Dmitriy Ka

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
773
Благодарностей
517
Баллы
93
Удачи в начинаниях, буду следить!
Лайк, подписка :-)
 

volody00

Client
Регистрация
06.09.2016
Сообщения
929
Благодарностей
1 019
Баллы
93
Последние пару недель изучал я LINQ. До этого избегал этой темы, да и зря наверное. На самом деле всё оказалось довольно просто. @KolkaPetkinSyn в своём блоге опубликовал пост, как он на python с помощью нейросети реализовал следующий код. У нас есть два списка:
"вася", "петя", "коля"
"иван", "лена", "петя", "вася"

наша задача сформировать 3-й список, в котором будут только уникальные значения из второго списка (т.е. "иван", "лена"). Так вот, в LINQ есть специальный метод для этого - Except().

Считать из файла на пк в список можно следующим образом:
C#:
var list = File.ReadAllLines(project.Path + "test.txt"); //в скобках путь к файлу
А записать с помощью File.WriteAllLines(); где мы в скобках передаем путь к файлу

Я этого делать не буду, дабы вы могли запустить код без "танцев с бубном". Я просто создам два списка, заполню их значениями и продемонстрирую работу метода Except.

C#:
List<string> listStart = new List<string>() {
    "строка 1",
    "строка 2",
    "строка 3",
    "строка 4",
    "строка 5",
    "строка 6",
    "строка 7"
};
List<string> listTwo = new List<string>() {
    "строка 2",
    "строка 321",
    "строка 5",
    "строка 5433",
    "строка 4335345",
    "строка 7"
};

//получаем только уникальные значения списка №2
var result = listTwo.Except(listStart).ToList();

//выводим в лог
result.ForEach(x=>project.SendInfoToLog(x)); //"строка 321", "строка 5433", "строка 4335345"
P.S. Ну а если вам тяжело даётся изучение c#, то приглашаю на свой курс. Старт в сентябре. Ссылка в подписи
 

volody00

Client
Регистрация
06.09.2016
Сообщения
929
Благодарностей
1 019
Баллы
93
Ну не чудо ли этот ChatGpt?

Вот такой вопрос на форуме нашёл:

124797


Вспомнил, что Radzhab писал о word документах. Открыл статью (https://zenno.club/discussion/threads/sozdanie-word-dokumentov.15666/), посмотрел, что за библиотека используется. Это docx.

Пошёл к chatGpt и спрашиваю: "Как скопировать word с помощью docx c#"? Получаю ответ:

C#:
using System;

using Xceed.Words.NET;



class Program

{

    static void Main()

    {

        string filePath = @"path\to\your\document.docx"; // Укажите путь к вашему документу



        using (var document = DocX.Load(filePath))

        {

            // Чтение всего текста из документа

            string allText = document.Text;



            // Вывод текста на консоль или использование в других целях

            Console.WriteLine(allText);

        }

    }

}
Скачал библиотеку из Nuget, закинул в externalAssemblies и в ссылки из GAC. Вставил код, подправив путь к документу и куда сохранять. И готово!

А если бы не chatGpt, пришлось бы хрен знает сколько документацию к библиотеке читать. И неизвестно ещё, разобрался бы или нет. А может там вообще не было бы этого метода и пришлось бы гуглить другие библиотеки. А так красота! На всё про всё ушло минут 10-20 вместо нескольких часов, если бы сам пытался разобраться.

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

Пару недель назад общался с человеком, который без знаний c# смог целую программу для себя написать с помощью chatGpt, которая pdf создает в нужном ему формате. Так что учите основы c# и используйте chatGpt, пока возможность есть.

Шаблон и библиотеку прикрепил. библиотеку кидаем по пути ZennoPoster Pro V7\7.7.16.0\Progs\ExternalAssemblies

P.S. А библиотеку то нельзя прикрепить. Ограничение на форуме сделали для dll файлов. Печально, ибо зенка у нас немного древняя, не все библиотеки из Nuget заводится будут. А теперь их и на форуме не скачаешь. Эх... Закинул пока на диск, но долго ли она там пролежит не знаю - https://cloud.mail.ru/public/M5f4/A3aEZ7Ci7
 

Вложения

  • Спасибо
Реакции: VladV777 и санчил

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
773
Благодарностей
517
Баллы
93
  • Спасибо
Реакции: volody00

volody00

Client
Регистрация
06.09.2016
Сообщения
929
Благодарностей
1 019
Баллы
93
Дайджест недели:
  • Залит ролик на ютуб -
  • Залит 2-й выпуск по моим попыткам освоить телеграмм ботов - https://t.me/zennovolody00
Постараюсь больше не пропадать и раз в неделю что-нибудь да выпускать. Хотя бы для себя, ну а если кому-то будет полезно, то тоже хорошо
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)