Как суммировать в C# числа из списка?

AlinaSev99

Новичок
Регистрация
01.09.2020
Сообщения
8
Благодарностей
3
Баллы
3
Подскажите пожалуйста, у меня есть список с числами (целыми и десятичными: 3; 5; 4,5), количество чисел может меняться. Мне нужно с помощью C# их суммировать.
Пробовала таким кодом, но не получается, добавляет в переменную просто значение в виде: 3+5+4,5 и не пойму, как сделать, что бы сразу получить сумму.
C#:
IZennoList list = project.Lists["Список 1"]; // List - название списка проекта

string separator = "+"; // разделитель



string unix = string.Join(separator, list.ToList());

//int unix = int.Parse(project.Variables["df"].Value);

return unix;
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
что бы сложить числа, они должны быть типа int , а тут происходит контагенация строк, так как в списке может храниться только один тип данных - строка.
 
  • Спасибо
Реакции: BAZAg

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 022
Благодарностей
1 424
Баллы
113
попробуйте так:
C#:
var list = project.Lists["spisok"];//название списка проекта
double summa = 0;//объявляем переменную, в которую будем считать сумму
foreach(string s in list){//в цикле перебираем список и не важно, какое количество строк там будет
    try{//на всякий случай поймаем возможное исключение
        summa+=double.Parse(s);//суммируем, приводя к необходимому типу
    }catch{project.SendInfoToLog(string.Format("Среди строк с числами закралась строка с НЕ числом: {0}", s), true);}//и выведем в лог строку, которая не является числом
}
return summa;//возвращаем из кубика сумму - в настройках кубика необходимо указать переменную для вывода
 
Последнее редактирование:

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 788
Благодарностей
2 453
Баллы
113
Перед использования кода ниже нужно знать, что в списке находятся только строки в виде чисел.
Иначе - нужно либо усложнить его (хотя, удобнее перед добавлением в список убеждаться что там число), либо использовать код с проверками, например как предложил пользователь Alexmd.
Как и написал Phoenix78 - математикой можно заниматься только с числами.
А списки у Зеннопостера работают с строками текста - прежде нужно приводить каждое значение к числу, а уже потом заниматься суммированием.

C#:
// Подготовка - наполнение списка
string list_name = "list"; //список который должен существовать в шаблоне
project.Lists[list_name].Clear(); // Очистим список
project.Lists[list_name].AddRange(Enumerable.Range(1, 10).Select(s=>s.ToString())); // наполняю список

// Собственно находим сумму
return project.Lists[list_name].Select(int.Parse).Sum();
 
Последнее редактирование:

zhekmans

Client
Регистрация
31.05.2019
Сообщения
211
Благодарностей
30
Баллы
28
попробуйте так:
C#:
var list = project.Lists["spisok"];//название списка проекта
double summa = 0;//объявляем переменную, в которую будем считать сумму
foreach(string s in list){//в цикле перебираем список и не важно, какое количество строк там будет
    try{//на всякий случай поймаем возможное исключение
        summa+=double.Parse(s);//суммируем, приводя к необходимому типу
    }catch{project.SendInfoToLog(string.Format("Среди строк с числами закралась строка с НЕ числом: {0}", s), true);}//и выведем в лог строку, которая не является числом
}
return summa;//возвращаем из кубика сумму - в настройках кубика необходимо указать переменную для вывода
А как в этом коде добавить чтоб удалялась строка, которая не является числом?
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 788
Благодарностей
1 952
Баллы
113
А как в этом коде добавить чтоб удалялась строка, которая не является числом?
Используйте TryParse вместо Parse. Если в строке будет не число, то значение будет 0
C#:
                   double summa = 0;//объявляем переменную, в которую будем считать сумму

                double res = 0;

                for (int i = 0; i < list.Count; i++)
                {//в цикле перебираем список и не важно, какое количество строк там будет
                    string s = list[i];

                    try
                    {//на всякий случай поймаем возможное исключение

                        double.TryParse(s, out res);

                        if(res == 0)
                        {
                            list.Remove(s);// Удаляем строку  или можно так list.RemoveAt(i);
                             i--;// Меняем счетчик, чтобы взят след строку
                              continue;
                        }

                        summa += result;
                    }
                    catch { project.SendInfoToLog(string.Format("Среди строк с числами закралась строка с НЕ числом: {0}", s), true); }//и выведем в лог строку, которая не является числом
                }
                return summa;//возвращаем из кубика сумму - в настройках кубика необходимо указать переменную для вывода
 
Последнее редактирование:
  • Спасибо
Реакции: zhekmans

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Используйте TryParse вместо Parse. Если в строке будет не число, то значение будет 0
C#:
                   double summa = 0;//объявляем переменную, в которую будем считать сумму

                double res = 0;

                for (int i = 0; i < list.Count; i++)
                {//в цикле перебираем список и не важно, какое количество строк там будет
                    string s = list[i];

                    try
                    {//на всякий случай поймаем возможное исключение

                        double.TryParse(s, out res);

                        if(res == 0)
                        {
                            list.Remove(s);// Удаляем строку  или можно так list.RemoveAt(i);
                             i--;// Меняем счетчик, чтобы взят след строку
                              continue;
                        }

                        summa += result;
                    }
                    catch { project.SendInfoToLog(string.Format("Среди строк с числами закралась строка с НЕ числом: {0}", s), true); }//и выведем в лог строку, которая не является числом
                }
                return summa;//возвращаем из кубика сумму - в настройках кубика необходимо указать переменную для вывода
TryParse возвращает true или false. Ориентироваться на это более перспективно
 
  • Спасибо
Реакции: zhekmans

braind

Client
Регистрация
10.10.2012
Сообщения
119
Благодарностей
12
Баллы
18
Прошу помощи
Есть список с большим количеством чисел (несколько тысяч), нужно вычислить среднее.
Я не знаю C#, поэтому из примеров выше что-то полезное не смог сделать.
зенка ругается, что числа в списке - это строки и не складывает их.
Может кто написать код, как перевести строки в списке в формат числа и сложить их?
 

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 022
Благодарностей
1 424
Баллы
113
C#:
return project.Lists["список с числами"].Select(x=>double.Parse(x)).Average();
 

braind

Client
Регистрация
10.10.2012
Сообщения
119
Благодарностей
12
Баллы
18
Последнее редактирование:

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
ошибку выдает, видимо что-то еще нужно сделать? объявить x?
я к сожалению вообще на "ты" с c#
C#:
double number;
return project.Lists["список с числами"].Where(x => double.TryParse(x.Trim(), out number)).Select(x => double.Parse(x.Trim())).Average();
 

braind

Client
Регистрация
10.10.2012
Сообщения
119
Благодарностей
12
Баллы
18
C#:
double number;
return project.Lists["список с числами"].Where(x => double.TryParse(x.Trim(), out number)).Select(x => double.Parse(x.Trim())).Average();
Спасибо, ваш код работает, когда в списке числа.
Но у меня в списке числа в формате строки.
Есть простой способ перевести все строки в списке в числовой формат?
 

Wide

Client
Регистрация
04.02.2013
Сообщения
945
Благодарностей
257
Баллы
63
попробуйте так:
C#:
var list = project.Lists["spisok"];//название списка проекта
double summa = 0;//объявляем переменную, в которую будем считать сумму
foreach(string s in list){//в цикле перебираем список и не важно, какое количество строк там будет
    try{//на всякий случай поймаем возможное исключение
        summa+=double.Parse(s);//суммируем, приводя к необходимому типу
    }catch{project.SendInfoToLog(string.Format("Среди строк с числами закралась строка с НЕ числом: {0}", s), true);}//и выведем в лог строку, которая не является числом
}
return summa;//возвращаем из кубика сумму - в настройках кубика необходимо указать переменную для вывода
Парни подскажите как добавить разделитель плз. В списке есть точки и запятые, нужно эти строки тоже суммировать.
 

xatchikzzz

Client
Регистрация
08.09.2010
Сообщения
577
Благодарностей
41
Баллы
28
91449


а если в списке числа такого формата ... как их можно преобразовать в числа и сложить
 

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
549
Благодарностей
1 130
Баллы
93
Посмотреть вложение 91449

а если в списке числа такого формата ... как их можно преобразовать в числа и сложить
Суть в том, что в этих числах точки. Их нужно заменить на запятые и привести к double

Сумировать весь список:
double reserveNumber = 0;
foreach (string strNum in project.Lists["num"])
    reserveNumber += double.Parse(strNum.Replace('.', ','));

return reserveNumber;
Сумировать весь список [одной строчкой]:
return project.Lists["num"].Sum(strNum => double.Parse(strNum.Replace('.', ',')));
 
  • Спасибо
Реакции: vedi108 и xatchikzzz

kolina

Client
Регистрация
05.10.2019
Сообщения
165
Благодарностей
47
Баллы
28
А как получить сумму если в переменной находится выражение
В переменной symma лежит 25+48+24,6+16,8
C#:
double symma = double.Parse(project.Variables["symma"].Value);


double res = (symma);
project.Variables["Zakypka"].Value = res.ToString();

Данным способом делаю вычисления с несколькими переменными. А когда выражение лежит в одной переменной, не хочет считать. Как я понимаю потому что + это не double. А как решить тогда?
 

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