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

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
650
Благодарностей
592
Баллы
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 789
Благодарностей
5 727
Баллы
113

Ilshakin

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

Alexmd

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

Ilshakin

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

Phoenix78

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

Ilshakin

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

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 427
Баллы
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
Сообщения
650
Благодарностей
592
Баллы
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
Сообщения
1 038
Благодарностей
560
Баллы
113
Взять из списка 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)