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

Rimen

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

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

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

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

Как это сделать?
 
Возможно не массив.
Мне фактически нужны
а) все уникальные значения
б) кол-во каждого уникального значения

Массив предполагаю как оптимальное решение, но не уверен что это так.
возможно через объекты или еще как
 
Можно воспользоваться словарём (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
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);

 
просто глянуть
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()));
 
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);

Подскажите пожалуйста а как вы сделали здесь пошагово внутри с#-кубика
2021-05-22_143224.png


не знал что так можно и не нашел внутри ПМ где это можно повторить
 
А может кто скинет код, чтоб в список сохранялись уникальные значения (без счетчиков)?
 
Последнее редактирование:
  • Спасибо
Реакции: Sho и Ilshakin
А может кто скинет код, чтоб в список сохранялись уникальные значения (без счетчиков)?

C#:
Развернуть Свернуть Копировать
var res = Enumerable.Range(1, 100).Select(x => Guid.NewGuid().ToString("n"));
где 100 - нужное кол-во значений
 
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")));
 

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