Метод подсчета вхождений в список
Есть ли простой способ подсчитать количество вхождений всех элементов списка в тот же список в С#?
Что-то вроде этого:
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]);
}
}
Ответы
Ответ 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
Ваш внешний цикл перебирает все слова в списке. Это ненужно и вызовет у вас проблемы. Удалите его, и он должен работать правильно.