2009-07-16 9 views
37

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

답변

67

을 계산하는 방법을 이런 식으로 뭔가 ... 코멘트 당

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

편집에 관한 : 나는 시도하고이 정의를 할 것입니다. :)

제 예제는 int list이기 때문에 Func<int, TKey>입니다. 그래서, 나는 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. 
} 

그래서, 즉 ...

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

int를 타고 같은 단지 문자열을 반환 것 Func을이다 그러나, 원래 목록 값을 알고 요구 원래의 질문부터하고 계산이다, 정수를 사용하여 예제를 더 간단하게 만들었습니다.

+1

+1. 이것은 각기 다른 요소의 출현을 세는 것이 매우 우아합니다. –

+0

어떨까요? 좋아요? – CodeFusionMobile

+0

FindAll은 술어와 일치하는 원본 목록의 요소 목록을 반환하므로 각 고유 요소에 대해 한 번 수행해야 해당 요소의 수를 찾을 수 있습니다. –

-1

귀하의 외부 루프는 목록에있는 모든 단어 이상 반복한다. 불필요하며 문제가 발생할 것입니다. 그것을 제거하면 제대로 작동합니다.

7

사물 목록에서 계산하려면 다음과 같이하십시오.

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(); 
+1

+1 linqpad의 예제 중 하나에서 가져온 것입니다 : 그것은 getMethods는은() 일의 당신의 목록 이었다는 것을 알아 내기 위해 잠시 나를했다. :) –

+0

예, 나는 그것을 생각하고 더 읽기 쉽게하기로 결정했습니다. 고마워, 비록 내가 그 질문을 잘못 읽었다. 그것은 "모든 요소"를 계산하는 것을 말합니다 .. .. 이것은 여전히 ​​유용 할 것입니다. –

+0

@StanR. -이 솔루션은 내 문제를 해결합니다. 그러나, 단어 이상으로 발생을 계산할 수있는 메서드가 목록에 있습니까? "문자열"대신 "int"유형을 사용하고 있습니다. –

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