2014-05-15 3 views
1

여러 값을 가질 수있는 키를 출력해야합니다. 하지만 색인을 기반으로 인쇄해야합니다. 예 : 인덱스 0을 전달하면 A를 확인한 다음 값을 출력해야합니다. 1 대 n 것처럼.인덱스를 기준으로 그룹에서 값을 가져 오는 중

.FIRST()를 사용하고 있기 때문에 아래 예도 첫 번째로 인쇄하고 있습니다. 여러 값으로 N. 1 키를 1로 인쇄하려면 어떻게합니까?

recordList = new List<MyData>(); 
     MyData add = new MyData { Data1 = "A", Data2 = "A is for Apple" }; 
     recordList.Add(add); 
     MyData add1 = new MyData { Data1 = "A", Data2 = "B is for Ball" }; 
     recordList.Add(add1); 
     MyData add2 = new MyData { Data1 = "A", Data2 = "C is for Cat" }; 
     recordList.Add(add2); 
     MyData add3 = new MyData { Data1 = "A", Data2 = "D is for Doll" }; 
     recordList.Add(add3); 

    MyData add4 = new MyData { Data1 = "B", Data2 = "A is for Apple" }; 
     recordList.Add(add4); 
     MyData add5 = new MyData { Data1 = "B", Data2 = "B is for Ball" }; 
     recordList.Add(add5); 
     MyData add6 = new MyData { Data1 = "B", Data2 = "C is for Cat" }; 
     recordList.Add(add6); 
     MyData add7 = new MyData { Data1 = "B", Data2 = "D is for Doll" }; 
     recordList.Add(add7); 



var data = recordList.AsParallel().ToLookup(x => x.Data1, (x) => 
     { 
      return (from m in recordList where m.Data1 == x.Data1 select new MyData { Data2 = m.Data2, Data1 = m.Data1 }).First(); 

     }); 

    var output = data["A"]; 
      foreach(var print in output) 
      { 
       Console.WriteLine(print.Data1 + " "+ print.Data2); 
      } 

I가 Acheive 원하는 결과는 다음

A A is for Apple 
    B is for Ball 
    C is for Cat 
    D is for Doll 

대신 인쇄 I의 다른 방법이 통과 할 때문에. 그래서 하나의 키를 가지고 해당 값을 가져야합니다. Data1 속성에 의해

답변

1

그냥 그룹 항목 :

var groups = recordList.GroupBy(d => d.Data1); 

그런 다음 당신은 그들의 Data1 값으로 그룹화 된 항목이있을 것이다.

foreach(var data1Group in groups) 
{ 
    Console.WriteLine(data1Group.Key); // group key A or B 

    foreach(var data in data1Group) 
     Console.WriteLine(data.Data2); 
} 

또는 lookup

var lookup = recordList.ToLookup(d => d.Data1, d => d.Data2); 

// getting items for A 
foreach(var data2 in lookup["A"]) 
    Console.WriteLine(data2); 

당신은 그룹처럼 될 것입니다이 경우 조회에서 조회 항목을

var lookup = recordList.ToLookup(d => d.Data1); 

을 투사 건너 뛸 수 있습니다 사용하지만, 키 색인 액세스.


코드에 무슨 문제가 있습니까?

이 쿼리의
(from m in recordList 
    where m.Data1 == x.Data1 
    select new MyData { Data2 = m.Data2, Data1 = m.Data1 }).First() 

결과에 대한 동일합니다 : 그것은 Data1 속성 값에 의해 recordList에서

var data = recordList.ToLookup(x => x.Data1, (x) => 
{ 
    return (from m in recordList 
      where m.Data1 == x.Data1 
      select new MyData { Data2 = m.Data2, Data1 = m.Data1 }).First(); 
}); 

이 그룹 항목을 수행하고, 그 조회에두고 그룹의 각 항목에 대한 값을 다음과 같은 것을 볼 수 있습니다 그룹의 모든 항목 - recordList으로 이동하면 현재 항목과 동일한 Data1 (동일한 항목은 아님)과 동일한 첫 번째 항목을 찾아 사본을 만듭니다. 따라서 각 그룹의 첫 번째 항목의 사본으로 가득 찬 조회가 끝납니다.

+0

조회에 색인을 전달할 수 있습니까? 예를 들어 "A"를 전달하는 대신 색인으로 가져와야합니다. – user726720

+1

@ user726720'lookup.ElementAt (1)'? 'B'로 아이템을 얻고 싶다면. 하지만 그건 나에게 의미가 없습니다. 조회의 힘이 그룹화 값에 따라 항목을 가져오고 있습니다. –

+0

저는 찾고있는 것과 가장 가까운 색인을 반환하는 binarysearch 방법을 사용합니다. 이 인덱스 값을 가져 와서 MYDATA.Data1과 MYData.Data2를 가져오고 싶지만, 조회를 통해 요소 만 가져올 수 있다고 생각합니다. 왜 열쇠를 가져올 수 없어요. Console.writeline (data2.Data1, data2.Data2)에있는 경우 – user726720

관련 문제