Из таблицы получить уникальные значения и частоту каждого уникального значения. С#

Rimen

Client
Регистрация
28.10.2019
Сообщения
406
Благодарностей
254
Баллы
63
Всем большой привет и сразу отдельный низкий поклон всем кто вызовется помочь.

Задача: необходимо из столбца таблицы достать все уникальные значения и частоту встречания каждого уникального значения.

Пример данных столбца таблицы:
А
А
Б
В
А
Б
О

На выходе нужно внутри C# получить массив данных со значениями:
А = 3
Б = 2
В = 1
О = 1

Как это сделать?
 

Rimen

Client
Регистрация
28.10.2019
Сообщения
406
Благодарностей
254
Баллы
63
Возможно не массив.
Мне фактически нужны
а) все уникальные значения
б) кол-во каждого уникального значения

Массив предполагаю как оптимальное решение, но не уверен что это так.
возможно через объекты или еще как
 

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 820
Баллы
113
Можно воспользоваться словарём (Dictionary<TKey, TValue>)
C#:
// Тут надо указать имя своей таблицы и букву колонки.
var column = project.Tables["Таблица 1"].GetColumn("A");

var dict = new Dictionary<string, int>();
foreach (var cell in column)
{
    if (!dict.ContainsKey(cell))
    {
        dict.Add(cell, 1);
        continue;
    }
    
    dict[cell]++;
}
На выходе будет словарь dict: ключём будет значение из таблицы, значением - частота ключа. Получить частоту определённого ключа можно так - dict["key"] (вместо key Ваше значение).

Словарь - неупорядоченная коллекция! Т.е. добавленные элементы необязательно будут расположены в том порядке, в котором Вы их добавили.
 
  • Спасибо
Реакции: lamar015, Rimen и Alexmd

volody00

Client
Регистрация
06.09.2016
Сообщения
918
Благодарностей
953
Баллы
93
C#:
IZennoTable tablic = project.Tables["Таблица 1"];
Dictionary<string,int> slovar = new Dictionary<string,int>();

for(int i=0;i<tablic.RowCount;i++)
{
    string str = tablic.GetCell(0,i);
    
    if(slovar.ContainsKey(str))
    {
        slovar[str] = slovar[str] + 1;
    }
    else
    {
        slovar.Add(str,1);
    }
}

string[] mass = new string[slovar.Count];

int j=0;
foreach(var s in slovar)
{
    mass[j] = s.Key + "=" + s.Value.ToString();
    j++;
}

foreach(var s in mass) project.SendInfoToLog(s);
 

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 022
Благодарностей
1 424
Баллы
113
просто глянуть
C#:
project.Tables["таблица"].GetColumn("A").GroupBy(x=>x).ToDictionary(x=>x.Key,x=>x.Count()).ToList().ForEach(x=>project.SendInfoToLog(x.ToString()));
создать словарь, упорядочить его по количеству совпадений по убыванию и глянуть, что в нем.
C#:
Dictionary<string, int> dict = project.Tables["таблица"].GetColumn("A").GroupBy(x=>x).ToDictionary(x=>x.Key,x=>x.Count()).OrderByDescending(x=>x.Value).ToDictionary(x=>x.Key,x=>x.Value);
dict.ToList().ForEach(x=>project.SendInfoToLog(x.ToString()));
 

Rimen

Client
Регистрация
28.10.2019
Сообщения
406
Благодарностей
254
Баллы
63
Всем спасибо кто откликнулся.
Буду разбираться в примерах, позже закину сработавший вариант сюда (для истории)
 

Rimen

Client
Регистрация
28.10.2019
Сообщения
406
Благодарностей
254
Баллы
63
C#:
IZennoTable tablic = project.Tables["Таблица 1"];
Dictionary<string,int> slovar = new Dictionary<string,int>();

for(int i=0;i<tablic.RowCount;i++)
{
    string str = tablic.GetCell(0,i);
   
    if(slovar.ContainsKey(str))
    {
        slovar[str] = slovar[str] + 1;
    }
    else
    {
        slovar.Add(str,1);
    }
}

string[] mass = new string[slovar.Count];

int j=0;
foreach(var s in slovar)
{
    mass[j] = s.Key + "=" + s.Value.ToString();
    j++;
}

foreach(var s in mass) project.SendInfoToLog(s);
Подскажите пожалуйста а как вы сделали здесь пошагово внутри с#-кубика


не знал что так можно и не нашел внутри ПМ где это можно повторить
 

volody00

Client
Регистрация
06.09.2016
Сообщения
918
Благодарностей
953
Баллы
93
Красную точку поставь. Щёлкни мышкой туда где она на скрине стоит и она появится. Потом запускай
 
  • Спасибо
Реакции: Rimen

Rimen

Client
Регистрация
28.10.2019
Сообщения
406
Благодарностей
254
Баллы
63
Регистрация
26.05.2020
Сообщения
495
Благодарностей
172
Баллы
43
А может кто скинет код, чтоб в список сохранялись уникальные значения (без счетчиков)?
 

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
549
Благодарностей
1 130
Баллы
93
Последнее редактирование:
  • Спасибо
Реакции: Sho и Ilshakin

Ilshakin

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

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
549
Благодарностей
1 130
Баллы
93
C#:
var res = Enumerable.Range(1, 100).Select(x => Guid.NewGuid().ToString("n"));
где 100 - нужное кол-во значений
Крутое решение!)
Немного дополню для @Андрейка2020 :
C#:
// Создать в PM список с именем list
project.Lists["list"].AddRange(Enumerable.Range(1, 100).Select(x => Guid.NewGuid().ToString("n")));
 

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