Как посчитать кол-во вхождений строки в список?

  • Автор темы Автор темы WebBot
  • Дата начала Дата начала

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 832
Реакции
1 416
Баллы
113
Приветствую!
Буду Вам премного благодарен если подскажите как реализовать на C# следующую задачу:
Есть список с id-шниками. Нужно отобрать только те id-шники, которые встречаются в списке не менее N раз.

То есть из списка:
1
2
3
1
4
5
2

при N = 2, нужно получить
1
2

p.s список большой, несколько млн записей и больше ... поэтому хотелось бы решение, которое быстро работает
 
C#:
Развернуть Свернуть Копировать
var lst = project.Lists["Список 1"];
var newList = new List < string > ();
int kol = 2; // N

foreach(string val in lst) {
  if (lst.Where(x => x == val).Count() >= kol) // берем те элементы которые встречаются N раз
    newList.Add(val);
}

lst.Clear();
lst.AddRange(newList.Distinct());
 
Последнее редактирование:
Код:
Развернуть Свернуть Копировать
var lst = project.Lists["Список 1"];
int kol = 2; // N

lst = lst
    .GroupBy(i => i)
    .Where(i => i.Count() >= kol)
    .Select(i => i.Key)
    .ToList();
Имхо, так будет быстрее. Т.к. не вижу смысла проходить в цикле по всему списку, и на каждой итерации делать выборку.
Проще сразу сгруппировать, и потом отобрать только те, где кол-во >= N.
 
у меня оба варианта падают с ошибкой
первый вариант
Код:
Развернуть Свернуть Копировать
Ошибка в действии "****" "Неявное преобразование типа "string" в "int" невозможно". [Строка: 2; Cтолбец: 11]
второй вариант
Код:
Развернуть Свернуть Копировать
Ошибка в действии "****" "Неявное преобразование типа "System.Collections.Generic.List<string>" в "ZennoLab.InterfacesLibrary.ProjectModel.IZennoList" невозможно. Существует явное преобразование (возможно, отсутствует приведение)". [Строка: 7; Cтолбец: 5]
суть ошибки понимаю, погуглил но так и не разобрался с применением конверта и парсинга( кто может помочь?

забыл уточнить, мне нужно подсчитать количество вхождения фразы/слова.
делать предварительно замену искомого на цифру?
 
Последнее редактирование:
Код:
Развернуть Свернуть Копировать
Ошибка в действии "****" "Неявное преобразование типа "System.Collections.Generic.List<string>" в "ZennoLab.InterfacesLibrary.ProjectModel.IZennoList" невозможно. Существует явное преобразование (возможно, отсутствует приведение)". [Строка: 7; Cтолбец: 5]
Так попробуй.
Код:
Развернуть Свернуть Копировать
List<string> lst = project.Lists["Список 1"];
int kol = 2; // N
lst = lst
    .GroupBy(i => i)
    .Where(i => i.Count() >= kol)
    .Select(i => i.Key)
    .ToList();
 
  • Оценить
Реакции: kolllak
((
Код:
Развернуть Свернуть Копировать
Ошибка в действии "CS0266" "Неявное преобразование типа "ZennoLab.InterfacesLibrary.ProjectModel.IZennoList" в "System.Collections.Generic.List<string>" невозможно. Существует явное преобразование (возможно, отсутствует приведение)". [Строка: 0; Cтолбец: 20]
 
((
Код:
Развернуть Свернуть Копировать
Ошибка в действии "CS0266" "Неявное преобразование типа "ZennoLab.InterfacesLibrary.ProjectModel.IZennoList" в "System.Collections.Generic.List<string>" невозможно. Существует явное преобразование (возможно, отсутствует приведение)". [Строка: 0; Cтолбец: 20]
Первую строку заменить на
Код:
Развернуть Свернуть Копировать
List<string> lst = project.Lists["Список 1"].ToList();
PS. И код Radzhab'а работает нормально!
 
  • Оценить
Реакции: kolllak
Dimionix, он отработал без ошибок, ура, но список не изменился(, как посмотреть результат выполнения? извиняюсь что отвлекаю но в о многих проектах треубется расставить приоритет, а количество вхождений позволяет сформировать персональный топ..

вот к примеру список доменов (пришлось ужать не загружал чисто текстовик)
там 160 тыс. строк, при этом специально не чистил дубли. После выполнения их остается столько же при любом заданном пороге количества вхождений(
без дублей там порядка 30 тыс., т.е. пространство для работы есть..
 

Вложения

Последнее редактирование:
C#:
Развернуть Свернуть Копировать
var lst = project.Lists["Список 1"];
int kol = 2; // N

List<string> list = lst
    .GroupBy(i => i)
    .Where(i => i.Count() >= kol)
    .Select(i => i.Key)
    .ToList();

lst.Clear();
lst.AddRange(list);
может так
 
  • Оценить
Реакции: kolllak
C#:
Развернуть Свернуть Копировать
var lst = project.Lists["Список 1"];
int kol = 2; // N

List<string> tmpList = lst
    .GroupBy(i => i)
    .Where(i => i.Count() >= kol)
    .Select(i => i.Key)
    .ToList();

lst.Clear();
lst.AddRange(tmpList);
doc опередил:-)
 
  • Оценить
Реакции: kolllak
спасибо, сам после ночных бдений затупил сравнить варианты, все робит !!! +++
 

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