2012-04-11 2 views
2

그룹 (일부 값이 반복) 및 프로세스를 처리하는 :방법과 LINQ의 I는 정수의 간단한 목록을

var groups = from n in numbers 
    group n by n into numGroup 
    where numGroup.Count()>1 
    select numGroup; 

내가 직접 LINQ 후 중첩 된 루프와 그룹을 반복 할 수 있지만, 내가하는 데 문제입니다 그 (것)들을 통해 반복하기 위하여 분리되는 방법을 쓰는. 여기 내가 시도한 것이있다.

" '개체' 'GetEnumerator를'에 대한 공공의 정의가 포함되어 있지 않기 때문에 foreach 문 유형 '객체'의 변수에 작동 할 수 없습니다"

가 :

private void PrintGroups(IEnumerable groups, string title) 
{ 
    int i = 0; 
    foreach (var group in groups) 
    { 
     txt1.Text += "Group " + ++i + "\r\n"; ; 
     foreach (var x in group) 
       txt1.Text += " " + x.ToString() + "\r\n"; ; 
    } 
} 

컴파일러는 내부 foreach 문을 좋아하지 않는다

하지만 동일한 코드가 linq와 함께 작동합니다. 어떤 제안?

+1

@ Ek0nomik : 아니오, 문맥적인 키워드 일뿐입니다. –

+0

아야! 나는 그것을 발견하지 못했다고 믿을 수 없다. 난 상관없이 그것을 바꿀거야. 감사. – drg

답변

5
당신이 당신의 매개 변수의 유형을 변경해야 할 것 나에게 보이는

그러나

private void PrintGroups(IEnumerable<IGrouping<int, int>> groups, string title) 

을, 당신은 정말 키 카운트 단지 관심이 없다? 결국, 그룹의 모든 값은

한 예측에 생각 Linq에에서
private void PrintGroups(IEnumerable<IGrouping<int, int>> groups) 
{ 
    StringBuilder builder = new StringBuilder(); 
    foreach (var group in groups) 
    { 
     builder.AppendFormat("Group {0}: {1}\r\n", group.Key, group.Count()); 
    } 
    txt1.Text = builder.ToString(); 
} 
+0

예, 키와 개수가 더 좋을 것입니다. 그냥 천천히 배우고/일을 실현 천천히 LINQ 가르쳐 주려고 ... 감사합니다 – drg

0

, 여기에 내가에 표시 할 수있는 문자열로 숫자의 그룹을 프로젝트 예입니다 ... 동일합니다 사용자.

var nums = new List<int>() { 1, 1, 5, 6, 1, 5, 2 }; 

nums.GroupBy (n => n) 
    .Select (n => string.Format("Number {0} is found {1} times ({2})", n.Key, n.Count(), string.Join(",", n))) 
    .ToList() 
    .ForEach(strN => Console.WriteLine (strN)); 

/* Output 

Number 1 is found 3 times (1,1,1) 
Number 5 is found 2 times (5,5) 
Number 6 is found 1 times (6) 
Number 2 is found 1 times (2) 

*/ 
+0

에서 배울 또 다른 예! 감사. – drg