2011-04-19 5 views
1

LINQ를 사용하여 데이터 목록을 그룹화하고 병합하는 방법은 무엇입니까?

원본 데이터

Genre Name      Year 
Comedy Shrek Forever After  2010 
Drama The Karate Kid    2010 
Action Iron Man 2     2010 
Action Robin Hood     2010 
Drama The Kids Are All Right  2010 
Sci-Fi Inception     2010 

아래와 같이 나는 데이터의 목록을 가지고 있고이 그룹에 필요한 장르로 영화와 연결하여 유사한 영화는 새 목록 외모 때문에 ","로 구분 이름 같은

필수 데이터

Genre Name          Year 
Comedy Shrek Forever After      2010 
Drama The Karate Kid, The Kids Are All Right 2010 
Action Iron Man 2, Robin Hood     2010 
Sci-Fi Inception        2010 
,691,363 (210)

Dim result = From p In movies Group p By p.Genre Into Group Select New Movie With { 
     .Genre = Genre, 
     .Name = String.Join(", ", Group.Select(Function(p) p.Name).ToArray()), 
     .Year = Group.Select(Function(p) p.Year).FirstOrDefault 
     } 

을 다음과 같이 내가 쓴 LINQ 문은 내가 사용하지 않도록 그것을하는 또 다른 방법이 있나요이다 ".Year = Group.Select (기능 (p)를 p.Year) .FirstOrDefault "또는 다른 접근 방식을 사용합니다.

감사

샘플 코드 : 당신이 Year 그것이 안 클래스를 기반으로하는 널 수 없을 것이라고 확신 경우


Module Module1 

    Sub Main() 
     Dim movies As New List(Of Movie) 
     movies.Add(New Movie("Comedy", "Shrek Forever After", 2010)) 
     movies.Add(New Movie("Drama", "The Karate Kid", 2010)) 
     movies.Add(New Movie("Action", "Iron Man 2", 2010)) 
     movies.Add(New Movie("Action", "Robin Hood", 2010)) 
     movies.Add(New Movie("Drama", "The Kids Are All Right", 2010)) 
     movies.Add(New Movie("Sci-Fi", "Inception", 2010)) 

     'Group amd Merge by genre 
     Dim result = From p In movies Group p By p.Genre Into Group Select New Movie With { 
     .Genre = Genre, 
     .Name = String.Join(", ", Group.Select(Function(p) p.Name).ToArray()), 
     .Year = Group.Select(Function(p) p.Year).FirstOrDefault 
     } 

     For Each r In result 
      Console.WriteLine(r) 
     Next 
     Console.ReadKey() 
    End Sub 

    Public Class Movie 
     Public Genre As String 
     Public Name As String 
     Public Year As Integer 

     Public Sub New() 
     End Sub 

     Public Sub New(ByVal genre As String, ByVal name As String, ByVal year As Integer) 
      Me.Year = year 
      Me.Genre = genre 
      Me.Name = name 
     End Sub 

     Public Overrides Function ToString() As String 
      Return String.Format("Genre: {0}; Name:{1}; Year:{2}", Genre, Name, Year) 
     End Function 
    End Class 

End Module 

답변

2

, 당신은 대체 할 수 그것과 함께 :

.Year = Group.First().Year 

그러나 그룹핑 접근 방식에 질문을합니다. 동일한 장르의 영화가 같은 해를 공유하지 않으면 어떻게됩니까? 하나는 2009 년, 또 다른 2010 년이 될 수 있으며 자동으로 첫 해를 보게됩니다. 가장 최근 연도를 얻으려면 OrderBy을 추가 할 수 있지만 모두 그룹화 의도에 따라 다릅니다.

+0

답장을 보내 주셔서 감사합니다. 사용하고있는 예는 아이디어를 얻는 데 불과하며 매번 똑같을 때를 가정하고 있었기 때문에 제안이 저에게 효과적입니다. 위의 LINQ 쿼리는 이러한 문제를 해결하기 위해 최적화되어 있습니까? 다른 대안? – madan

+0

@ madan 나는 당신이 당신의 시나리오에 잘 어울리는 것 같아요. 원하는대로 모든 항목을 그룹화하면 변경할 필요가 없으며 쿼리가 간단합니다. –

관련 문제