2016-07-18 1 views
-1

동적으로 정의 된 중첩 된 문자열 목록이 있습니다.이 목록은 .txt로 채워집니다. 첫 번째 열의동적으로 정의 된 목록을 첫 번째 열 값으로 그룹화하고 나머지는 평균을 계산하는 방법?

EPC1687626298729872,12.4,11.3,6.2 EPC1687626298729872,5,6,2 
EPC1687626298729872,8,7.3,4 EPC1687626DDDD29872,11.4,10.3,5.2 
EPC1687626DDDD29872,9,16,2 EPC2798272987298798,17,2,2 
EPC2987398239879832,11,3,2 EPC9827298729872987,4,5,6 
EPC3929873981310091,2,2,2 EPC982733U209309280,4,7,11 

값이 항상 요구된다 (EPC로 시작) 다음과 같이

TXT의 전형적인 값이다. 내가해야 할 일은 동일한 EPC (첫 번째 열 값)가있는 행을 그룹화하고 나머지 값을 발생 횟수별로 평균하는 것입니다.

예를

를 들어
EPC1687626298729872,12.4,11.3,6.2 EPC1687626298729872,5,6,2 
EPC1687626298729872,8,7.3,4 EPC1687626DDDD29872,11.4,10.3,5.2 
EPC1687626DDDD29872,9,16,2 

EPC1687626298729872, (12.4+5+8)/3, (11.3+6+7.3)/3, (6.3+2+4)/3. 
EPC1687626DDDD29872, (11.4+9)/2 ,(10.3+16)/2, (5.2+2)/2 

당신의 도움에 미리 감사드립니다 제공해야합니다.

+0

하지만 Nullexception에 문제가있어서 동적 중첩 목록으로 이동하여 이름을 지정하지 않고 첫 번째 열을 기준으로 그룹화하는 방법을 알아 냈습니다. 하지만 아래 답변 덕분에 그것을 알아 냈습니다. 어쨌든. – HF20

답변

1

LINQ를 활용하면 그룹화, 평균 및 기타 모든 종류의 데이터 조작을위한 다양한 방법을 제공하므로 LINQ를 활용할 수 있습니다. 당신은 문자열과 숫자 데이터를 모두 가지고 일련의 문자열을 가지고 있기 때문에

귀하의 데이터

구문 분석, 당신은 당신의 요소까지의 각을 분할하고 그 개별 요소를 분할해야합니다, 즉 :

  • 공백과 개행 문자를 사용하여 기존 입력을 분할하여 각 요소를 제공하십시오 (예 : EPC1687626298729872,12.4,11.3,6.2).
  • 그런 다음 구분 기호로 쉼표를 사용하여 각 요소를 분할하여 각 값을 제공하십시오 (예 : { Name : EPC1687626298729872, P1 : 12.4, ... }).

    // Separate each of your elements 
    var elements = input.Split(new string[]{" ", Environment.NewLine},StringSplitOptions.RemoveEmptyEntries) 
            // Separate each element of the string 
            .Select(x => x.Split(',')) 
            // Now you have a series of arrays for each element, so map each 
            // into an object 
            .Select(x => new { 
              Name = x[0], 
              P1 = Decimal.Parse(x[1]), 
              P2 = Decimal.Parse(x[2]), 
              P3 = Decimal.Parse(x[3]) 
            }); 
    

    그룹 귀하의 데이터

    당신이 당신의 모든 요소를 ​​일단 :

이 쉽게 다음과 같을 수 LINQ의 Enumerable.Select() 방법과 함께 String.Split() 방법을 통해 수행 할 수 있습니다 이제는 개체로 그룹화하여 총 평균을 계산할 수 있습니다.

  • 각 요소를 Enumerable.GroupBy() 메서드를 통해 "이름"또는 "ID"로 그룹화하십시오.
  • 그룹을 사용하여 LINQ의 Enumerable.Average() 방법을 통해 평균을 계산하십시오.

이 같을 수 있습니다이 시점에서

// At this point you have all of your elements, so now group them 
// by their names and average 
var groups = elements.GroupBy(x => x.Name) 
        .Select(x => new { 
          Name = x.Key, 
          P1 = x.Average(y => y.P1), 
          P2 = x.Average(y => y.P2), 
          P3 = x.Average(y => y.P3) 
        }); 

, 당신은 당신의 결과를 반복하고 필요한 것을 얻을 수 있습니다

enter image description here

나는 2 차원 배열 장난되었다
+0

도움 주셔서 대단히 감사합니다. 코드는 정상적으로 작동하지만, 일반형 을 중첩 목록으로 변환 할 수 있습니까? 가 여기에 지금까지 시도 내용은 다음과 같습니다 목록을 그룹 = Db.GroupBy (X => x.Name) ALL 기타 사항 서보 -OFF (X => 새로운 { 이름 = x.Key, P1 = x.Average (Y = > y.P1) P2 = x.Average (y => y.P2), P3 = 제안 사항이 있으십니까? – HF20