2014-04-17 2 views
1

List (Of String)을 서브 클래 싱하여 VB.NET에서 StringList 클래스를 구현하려고합니다. 대부분의 List 메서드는 StringList 클래스에서 변경되지 않지만 메서드에 iterator.ToList()가 포함되는 경우 결과는 클래스로 다시 캐스팅 될 수없는 일반 목록입니다. .Distinct는 반복자를 반환하고 .ToListStringList에 캐스트 할 수없는 List(Of String)을 반환하기 때문에.Distinct 및 .ToList를 사용하여 .NET List 객체를 서브 클래 싱하기

Module Module1 
    Sub Main() 
     Dim a0 As New List(Of String) From {"Apple", "Banana", "Cherry", "Banana"} 
     Dim b0 As New StringList From {"Asparagus", "Broccoli", "Cucumber", "Broccoli"} 

     Dim a1 As List(Of String) = a0.Distinct.ToList ' list of 3 strings 
     Dim b1 As StringList = b0.Distinct.ToList ' runtime exception invalid cast from List(Of String) to StringList 
    End Sub 
End Module 

Class StringList 
    Inherits List(Of String) 

    Public Overrides Function ToString() As String 
     Return Strings.Join(Me.ToArray, ", ") 
    End Function 
End Class 

b1 할당이 실패합니다

는 코드를 살펴 보자.

일반 목록 대신 StringList을 사용할 수 있도록 Distinct() 또는 ToList()을 구현하는 올바른 방법은 무엇입니까?

+2

만약'StringList'가 당신이 보여주는 것처럼 간단하다면, 나는 그것이 정말로 존재할 필요가 있는지에 대해 심각하게 질문 할 것입니다. 'ToString'이 다르게 행동하는 것이 정말 중요합니까? String.Join()을 호출하는 List (Of String)의 확장 메소드는 다른 이름으로 프로젝트에 쉽게 추가 될 수 있습니다. –

답변

0

Damien_The_Unbeliever와 jmcilhinney는 둘 다 작동하지만 여러 가지 방법으로 해결책을 지적했습니다. 사용하는 코드는 StringList 클래스의 기본 설정과 향후 계획에 따라 다르지만, List(Of String) 또는 StringList 중 어느 것을 사용하는지 여부에 대해 불가지론적인 코드라는면에서 완전히 깨끗하지는 않습니다.

Damien_The_Unbeliever의 용액을 Imports로 이관 상기 StringList 클래스 불필요하고 List(Of String) 연장 :

Imports StringList = System.Collections.Generic.List(Of String) 

Module Module1 
    Sub Main() 
     Dim a0 As New List(Of String) From {"Apple", "Banana", "Cherry", "Banana"} 
     Dim b0 As New StringList From {"Asparagus", "Broccoli", "Cucumber", "Broccoli"} 

     Dim a1 As List(Of String) = a0.Distinct.ToList ' list of 3 strings 
     Dim b1 As StringList = b0.Distinct.ToList ' likewise 
     Console.WriteLine(b1.ToString2()) ' works, but you can't override ToString() 
    End Sub 

    <System.Runtime.CompilerServices.Extension()> 
    Public Function ToString2(ByVal s As StringList) As String 
     Return Strings.Join(s.ToArray, ", ") 
    End Function 
End Module 

jmcilhinney의 솔루션은 실제 클래스로 StringList 유지하고 StringList 객체를 산출하는 방법으로 IEnumerable(Of String) 연장 :

Module Module1 
    Sub Main() 
     Dim a0 As New List(Of String) From {"Apple", "Banana", "Cherry", "Banana"} 
     Dim b0 As New StringList From {"Asparagus", "Broccoli", "Cucumber", "Broccoli"} 

     Dim a1 As List(Of String) = a0.Distinct.ToList ' list of 3 strings 
     Dim b1 As StringList = b0.Distinct.ToStringList ' works, but you can't use ToList() 
     Console.WriteLine(b1.ToString()) 
    End Sub 

    <System.Runtime.CompilerServices.Extension()> 
    Public Function ToStringList(ByVal sl As IEnumerable(Of String)) As StringList 
     Dim ret As New StringList From {} 
     For Each i As String In sl 
      ret.Add(i) 
     Next 
     Return ret 
    End Function 
End Module 

Class StringList 
    Inherits List(Of String) 

    Public Overrides Function ToString() As String 
     Return Strings.Join(Me.ToArray, ", ") 
    End Function 
End Class 

답장을 보내 주시면 감사하겠습니다.

0

자신 만의 ToStringList 메서드를 작성해야합니다. ToList은 확장 방법이기 때문에 까지 확장 방법으로 ToStringList을 작성해야합니다.

관련 문제