2013-03-05 2 views
0

코드에서 문자열 [] (각 문자열 []이 열임) 목록으로 구문 분석되는 테이블이 있습니다.각 키마다 다른 목록을 반환하십시오.

Column1| Column2 | Column3 
--------+---------+---------- 
0  | 1  | 8 
3  | 2  | 3 
5  | 2  | 8 

Let's 말 :

string[] column1 = { 0, 3, 5 } 
string[] column2 = { 1, 2, 2 }; 
string[] column3 = { 8, 3, 8 }; 
List<string[]> table = new List<string[]>() { column1, column2, column3 }; 

내가 열 COLUMN3 GROUPBY (즉 열 1)을 선택하고 COLUMN3 각각 다른 값리스트를 생성 할. 즉, Column1을 column3으로 그룹화하고 Column3의 각기 다른 값에 대해 Column을 만듭니다.

출력은 다음과 같습니다

string[] result1 = { 3 }; // From column3[1] = 3 
string[] result2 = { 0, 5 }; // From column3[0] = column3[2] = 8 

post의 혼합을 키우면, msdn에서이 one 및 간단한 1. 나는이 post으로 수행 한 후, 컬럼 1과 3 열을 가진 개체를 만드는 방법에 대해 생각하고 :

Class Row { public Row(string row1, string row3); } 
List<Row> rows = new List<Row>(); 
for(int i = 0; i < column1.Length; i++) 
{ rows.Add(new Row(Column1[i], Column3[i])); } 

var output = rows.GroupBy(row => row.row3).ToDictionary(grp => grp.Key, grp => grp.ToList()); 

그러나이 코드는 코드가 조금 추한입니다. 내 말은

column3.selectmany(...).GroupBy(row => row.row3).ToDictionary(grp => grp.Key, grp => grp.ToList()); 

같은이 밤은 뭔가, 개체 목록 ...을 새로운 클래스를 생성하고 입력의 필요없이 일부 표현은 또한, 나는 출력으로

string[] result1 = { 3 }; // From column3[1] = 3 
string[] result2 = { 0, 5 }; // From column3[0] = column3[2] = 8 
+1

참고 또한이 * 질문은 질문해야 질문 *. 너는 무엇을 알고 싶니? – LukeH

+0

어떻게 할 수 있습니까? 새 클래스, 객체 목록을 만든 다음 groupby를 수행하면 실적이 저조한 것으로 보입니다 (좋은 코드는 아닙니다). 나는 selectmany 연산이 새로운 클래스를 만드는 대신에 더 좋을 것이라고 생각한다. 그러나 그것을 사용하는 방법을 잘 모른다. – Alberto

답변

1

대신합니다 그룹화를 위해 새로운 유형을 만들면 Zip 확장 방법과 anonymous type을 사용하여 행을 만들 수 있습니다.

그룹화는 꽤 간단합니다. 각 그룹은 3 열을 나타내는 키를 가지고 있으며, IGrouping 자체에만 열 1을 선택있는 행을 포함하는 IEnumerable입니다 :

var rows = column1.Zip(column3, (c1, c3) => new 
{ 
    Column1 = c1, 
    Column3 = c3 
}); 

var output = from row in rows 
      group row by row.Column3 into groupedRows 
      select groupedRows.Select(r => r.Column1).ToArray(); 

이는 IEnumerable<string[]>을 생산하고 있습니다.

0

pescolino 님의 답변은 Zip을 사용하여 매우 훌륭합니다. (당신이 .NET 4.x의에없는 경우 예) 원하는 결과를 생산하기 위해 다음 Select의 인덱서 과부하를 사용할 수를 사용할 수없는 경우 :

var res = col1.Select((fld,idx) => new { Field = fld, Index = idx }) 
      .GroupBy(entry => col3[entry.Index], entry => entry.Field) 
      .Select(grp => grp.ToArray()); 
관련 문제