Подтвердить что ты не робот

Метод подсчета вхождений в список

Есть ли простой способ подсчитать количество вхождений всех элементов списка в тот же список в С#?

Что-то вроде этого:

using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.Linq;

string Occur;
List<string> Words = new List<string>();
List<string> Occurrences = new List<string>();

// ~170 elements added. . . 

for (int i = 0;i<Words.Count;i++){
    Words = Words.Distinct().ToList();
    for (int ii = 0;ii<Words.Count;ii++){Occur = new Regex(Words[ii]).Matches(Words[]).Count;}
         Occurrences.Add (Occur);
         Console.Write("{0} ({1}), ", Words[i], Occurrences[i]);
    }
}
4b9b3361

Ответ 1

Как насчет чего-то подобного...

var l1 = new List<int>() { 1,2,3,4,5,2,2,2,4,4,4,1 };

var g = l1.GroupBy( i => i );

foreach( var grp in g )
{
  Console.WriteLine( "{0} {1}", grp.Key, grp.Count() );
}

Изменить за комментарий: Я постараюсь сделать это справедливо.:)

В моем примере это a Func<int, TKey>, потому что мой список - int. Итак, я рассказываю GroupBy, как группировать свои предметы. Func принимает int и возвращает ключ для моей группировки. В этом случае я получу IGrouping<int,int> (группировка int, введенная ключом int). Если я изменил его на (i => i.ToString()), например, я бы привязал свою группу к строке. Вы можете представить себе менее тривиальный пример, чем манипулирование "1", "2", "3"... возможно, я создаю функцию, которая возвращает "один", "два", "три", чтобы быть моими ключами...

private string SampleMethod( int i )
{
  // magically return "One" if i == 1, "Two" if i == 2, etc.
}

Итак, это Func, который возьмет int и вернет строку, точно так же, как...

i =>  // magically return "One" if i == 1, "Two" if i == 2, etc. 

Но, поскольку исходный вопрос вызвал знание исходного значения списка и его подсчет, я просто использовал целое число, чтобы использовать мою целую группировку, чтобы сделать мой пример более простым.

Ответ 2

var wordCount =
    from word in words
    group word by word into g
    select new { g.Key, Count = g.Count() };    

Это взято из одного из примеров в linqpad

Ответ 3

Вы можете сделать что-то подобное, чтобы рассчитывать на список вещей.

IList<String> names = new List<string>() { "ToString", "Format" };
IEnumerable<String> methodNames = typeof(String).GetMethods().Select(x => x.Name);

int count = methodNames.Where(x => names.Contains(x)).Count();

Чтобы подсчитать один элемент

string occur = "Test1";
IList<String> words = new List<string>() {"Test1","Test2","Test3","Test1"};

int count = words.Where(x => x.Equals(occur)).Count();

Ответ 4

Ваш внешний цикл перебирает все слова в списке. Это ненужно и вызовет у вас проблемы. Удалите его, и он должен работать правильно.