Метод подсчета вхождений в списке - PullRequest
42 голосов
/ 16 июля 2009

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

Примерно так:

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]);
    }
}

Ответы [ 4 ]

73 голосов
/ 16 июля 2009

Как на счет этого ...

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() );
}

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

В моем примере это Func<int, TKey>, потому что мой список - целые. Итак, я говорю GroupBy, как группировать свои товары. Func принимает int и возвращает ключ для моей группировки. В этом случае я получу IGrouping<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. 

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

13 голосов
/ 16 июля 2009
var wordCount =
    from word in words
    group word by word into g
    select new { g.Key, Count = g.Count() };    

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

13 голосов
/ 16 июля 2009

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

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();
0 голосов
/ 16 июля 2009

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

...