2017-09-21 5 views
2

このプログラムは、ゲームのハイスコアをソートし、ユーザ名USING LISTSで最大から最小まで表示する必要があります。これまでのところ私は書かれています:整数と文字列のリストをVBの整数降順で並べ替える

Public highscore As New List(Of HighScores) 

highscore.Add(New HighScores("Jeremias", 6)) 
highscore.Add(New HighScores("Tom", 1)) 
highscore.Add(New HighScores("sdf", 5)) 
highscore.Add(New HighScores("asfd", 1)) 

highscore.Sort() 
highscore.Reverse() 

Console.WriteLine("------High Scores-----") 
For Each scores In highscore 
    Console.WriteLine(scores) 
Next 
Console.WriteLine("----------------------") 

そして、ハイスコアのクラス:

Public Class HighScores 
    Public name As String 
    Public score As Integer 

    Public Sub New(ByVal name As String, ByVal score As Integer) 
     Me.name = name 
     Me.score = score 
    End Sub 

    Public Overrides Function ToString() As String 
     Return String.Format("{0}, {1}", Me.name, Me.score) 
    End Function 
End Class 

通常私はちょうどリストをソートする.Sort()と.Reverse()を使用しますが、この場合、私ドン私はこれをすることができると思います。どのように私は/これを書き換えることができますどのようなアイデアだけで簡単にリストをソート?

答えて

3

List(Of T)のソート方法をさまざまに指定できます。最も簡単なのはそのようなものだ:

Comparison(Of T)デリゲートを取り、そのデリゲートのためのラムダ式を使用しています Sortのオーバーロードを使用しています
highscore.Sort(Function(x, y) y.score.CompareTo(x.score)) 

。ラムダパラメータはxyであり、本文はscoreyCompareToを呼び出します。これは、並べ替えが降順で行われ、Reverseを呼び出す必要がなくなるため、重要です。

ラムダの代わりに名前付きのメソッドを使用できます。このような方法は、次のようになります。

Private Function CompareHighScoresByScoreDescending(x As HighScores, y As HighScores) As Integer 
    Return y.score.CompareTo(x.score) 
End Function 

ソートするためのコードは次のようになります。ソートするためにオブジェクトを比較すると

highscore.Sort(AddressOf CompareHighScoresByScoreDescending) 

、大会は-1、0と1を使用することです相対的な位置を表す。これは、CompareToが行うことであり、これが私たちの比較方法がここで行うことです。 CompareToと呼んでいるオブジェクトが概念的に少ない場合は、渡すオブジェクトは-1になります。 1は最初のオブジェクトが2番目のオブジェクトより大きく、0が等しいことを意味します。その方法は、そのように書き換えることができます

Private Function CompareHighScoresByScoreDescending(x As HighScores, y As HighScores) As Integer 
    If y.score < x.score Then 
     Return -1 
    ElseIf y.score > x.score Then 
     Return 1 
    Else 
     Return 0 
    End If 
End Function 

それはしかしIntegerタイプ、すなわちそのCompareTo方法の既存IComparable実装を使用することは明らかに、より簡潔です。

ところで、あなたのコードは、他の領域でいくつかの改良を加えることができます。まず、HighScoresはそのクラスの適切な名前ではありません。それは一つのことを表しているので、名前は複数形であってはならず、実際にはそれ自体で高い得点を表さない。より適切な名前はPlayerScoreであり、それが表すものがより正確に記述されるからです。

第2に、変数Listは、複数のオブジェクトを含む複数のオブジェクト、つまり複数のアイテムを含むリストを表しているため、複数の名前が必要です。実際には高い得点を表しているので、highScoresという名前にする必要があります。

最後に、メンバ変数を公開することは、ほぼ普遍的に悪いことです。そのクラスのプロパティを絶対に使用する必要があります。

さらに、VS2015以降を使用している場合は、String.Formatを文字列補間に置き換えることもできます。

Public Class PlayerScore 

    Public Property Name As String 
    Public Property Score As Integer 

    Public Sub New(name As String, score As Integer) 
     Me.Name = name 
     Me.Score = score 
    End Sub 

    Public Overrides Function ToString() As String 
     Return $"{Name}, {Score}" 
    End Function 

End Class 
+0

ありがとうございます、私が探していたものです! –

関連する問題