Взять из списка строго указанное значение с разделитем

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
632
Благодарностей
543
Баллы
93
Господа, прошу помощи!
Суть: необходимо брать из файла email-адреса. Кол-во строк, которые необходимо взять обозначены переменной.
В случае, если кол-во строк, которые нужно взять, превышают оставшиеся email в файле, то взять все, что сталось.
Если в переменной задано, что нужно взять только 1 email, то идет обертывание этой строки в: "[email protected]":""
Если в переменной задано, что нужно взять несколько email, то идет обертывание через запятую: "[email protected]":"","[email protected]":""
Если список пустой, то выходим по красной.
Сам код:

C#:
string fileName = project.Variables["base_path"].Value;

try {
   
lock(CommonCode.email_base)

{

var list = project.Lists["email_base"];// Исходный список
StringBuilder strb = new StringBuilder();

   
    if (project.Variables["how_to_count"].Value =="") {
    project.Variables["how_to_count"].Value = "0";}
   
    if (project.Variables["how_to_count"].Value !="") {
   
int j = int.Parse(project.Variables["how_to_count"].Value);    //Переменная, в которой задается кол-во email, которые необходимо взять
for (int i = 0; i < j; i++) {
int r = 0;
if (i + 1 == j){
strb.Append("\"" + list[r]+ "\":\"\"");}
else {
strb.Append("\"" +list[r] + "\":\"\",");}
list.RemoveAt(r);
               if (list.Count <= j) {
            var dob = strb.ToString();  
            project.Variables["to"].Value = dob;}

            if (list.Count == 0) {
                return strb.ToString();
                project.Variables["to"].Value = strb.ToString();}
       
           
           
}}
project.Variables["to"].Value = strb.ToString();
}

}
catch {
ZennoPoster.StopTask(Guid.Parse(project.TaskId));
throw new Exception("[==Gmail.com==] - " + "Закончились получатели, рассылка с данного почтовика будет остановлена! Пополните файл " + fileName);}

В чем собственно затык:
если кол-во email, которые необходимо взять [how_to_count] больше, чем их всего осталось в списке, то строки берутся с лишней запятой на конце, пример:
66761


Во всех остальных случаях - все работает, как положено, без добавления запятой после последнего взятого email-адреса:
66762



P.S можно попробовать сделать обрез запятой, что то из разряда

C#:
               if (list.Count <= j) {
            var obrez = strb.ToString();
            obrez = obrez.Substring(0,(obrez.Length-1));
            project.Variables["to"].Value = obrez;}
но, как тогда узнать, что на конце именно запятая, а не двойные кавычки....
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 694
Баллы
113

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
632
Благодарностей
543
Баллы
93

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 387
Баллы
113
Ну, как бы все просто. Собирай в список, а потом используй string.Join(",",list); И я бы вообще по-другому сделал. Если не срочно, через пару часов освобожусь и сделаю.
 
  • Спасибо
Реакции: Ilshakin

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
632
Благодарностей
543
Баллы
93
Ну, как бы все просто. Собирай в список, а потом используй string.Join(",",list); И я бы вообще по-другому сделал. Если не срочно, через пару часов освобожусь и сделаю.
Подожду, конечно.
Со string.Join не совсем понятно, как работать с обертыванием адреса в "[email protected]":""
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 694
Баллы
113

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
632
Благодарностей
543
Баллы
93

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 387
Баллы
113
Постарался подробно прокомментировать, что тут происходит.
Надеюсь, я правильно понял задачу.
C#:
string str = "GET"; //имя переменной проекта, куда надо записать результат
var list = project.Lists["список почт"];//входящий список
int countTo = 3;//сюда вставить свою переменную, обозначающую количество требуемых почт

////
int countOf = list.Count;//количество строк во входящем списке
if(list.Count > 0){
    if(countTo <= 0)
        throw new Exception("Вряд ли Вы хотите получить отрицательное или нулевое количество строк");//тут и так понятно
    List<string> newlist = new List<string>();//создаем временный список
    for(int i = 0; i < countOf;){//будем брать строки в цикле из всего списка, а если нам нужно меньше, чем там есть, выйдем по break
        if(i++ == countTo)break;
        newlist.Add(string.Format("\"{0}\":\"\"", list[0]));//добавляем в список строку в нужном виде
        list.RemoveAt(0);//удаляем строку после взятия
    }
    if(list.Count == 0)
        project.SendWarningToLog("Забрали все почты из списка");
    project.Variables[@str].Value = string.Join(",",newlist);
}
else throw new Exception("список почт пуст");
 
  • Спасибо
Реакции: Ilshakin

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
632
Благодарностей
543
Баллы
93
Постарался подробно прокомментировать, что тут происходит.
Надеюсь, я правильно понял задачу.
C#:
string str = "GET"; //имя переменной проекта, куда надо записать результат
var list = project.Lists["список почт"];//входящий список
int countTo = 3;//сюда вставить свою переменную, обозначающую количество требуемых почт

////
int countOf = list.Count;//количество строк во входящем списке
if(list.Count > 0){
    if(countTo <= 0)
        throw new Exception("Вряд ли Вы хотите получить отрицательное или нулевое количество строк");//тут и так понятно
    List<string> newlist = new List<string>();//создаем временный список
    for(int i = 0; i < countOf;){//будем брать строки в цикле из всего списка, а если нам нужно меньше, чем там есть, выйдем по break
        if(i++ == countTo)break;
        newlist.Add(string.Format("\"{0}\":\"\"", list[0]));//добавляем в список строку в нужном виде
        list.RemoveAt(0);//удаляем строку после взятия
    }
    if(list.Count == 0)
        project.SendWarningToLog("Забрали все почты из списка");
    project.Variables[@str].Value = string.Join(",",newlist);
}
else throw new Exception("список почт пуст");
Благодарю, работает верно!
 
  • Спасибо
Реакции: Alexmd

axaptus

Активный пользователь
Регистрация
03.06.2018
Сообщения
101
Благодарностей
42
Баллы
28

kagorec

Client
Регистрация
24.08.2013
Сообщения
927
Благодарностей
481
Баллы
63
Взять из списка list1 три строки (с удалением) обьеденить через пробел в одну строку.
Записать эту строку в список list2.

Подробнее:
list1 это список в котором более 100 строк, разделители строк это переход строки. Необходимо из списка list1 взять три строки и обьеденить через пробел в одну строку и эту строку записать в другой список list2. Операцию повторить много раз, с удалением взятых строк из list1. Если в списке list1 остается недостаточное количество строк то брать столько сколько осталось. Не обрабатывать список list1 если строк меньше 1

Готовый снипет
C#:
var list1 = project.Lists["list1"];
var list2 = project.Lists["list2"];
int i = 3;

lock (SyncObjects.ListSyncer)
{
    if (list1.Count < 1)
    {
        return string.Empty;
    }

    while (list1.Count >= i)
    {
        StringBuilder strb = new StringBuilder();
        for (int j = 0; j < i; j++)
        {
            strb.Append(list1[0]);
            if (j != i - 1)
            {
                strb.Append(" ");
            }
            list1.RemoveAt(0);
        }
        list2.Add(strb.ToString());
    }

    if (list1.Count > 0)
    {
        list2.Add(string.Join(" ", list1));
        list1.Clear();
    }
}

return string.Empty;
 
Последнее редактирование:

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