2016-09-18 1 views
1

私はSaveFileというカスタムクラスを持っています。それが持つ1つのプロパティはSaveNumberであり、そのプロパティでリストをソートしようとしています。私はここで記事の束を読んで、それを適切に分類するようにしましたが、それは早い段階で止まっていますか?私が気づいたのは79セーブのセットです。 1、2、3、4、5、6、7、10、11、... 30、8、31、... 70、9、71、..ソートコード:ソートリスト(Of T)が早く中止する

saveList.Sort(Function(x, y) x.CompareTo(y)

しかし、私は、コードを使用する場合:

For i = 0 To 3 
    saveList.Sort(Function(x, y) x.CompareTo(y)) 
Next 

それは右のソートが、それは非常に長い時間がかかり、1セットが、それは私のプログラムのために、ほぼ5分かかりますので、その中の700以上のセーブファイルを持っていますロードする。何か案は?

これは私が私のCompareTo機能を持っているコードされています。それはチャンスの誰かが両方への答えを知って減少するため、

Public Function CompareTo(y As SaveFile) As Integer Implements IComparable(Of SaveFile).CompareTo 



    'If neither are an autosave then compare save number 
    If Not Me.Text.StartsWith("autosave") And Not y.Text.StartsWith("autosave") Then 

     If Me.SaveNumber.ToString.Length > y.SaveNumber.ToString.Length Then 
      Return False 
     ElseIf Me.SaveNumber.ToString.Length < y.SaveNumber.ToString.Length Then 
      Return True 
     End If 

     Return Me.SaveNumber < y.SaveNumber 
     'if either is an autosave 
    Else 
     'Create to comparable integers with 
     'a value of 4. We set the value to 
     '4 because it is higher than the 3 
     'available autosaves, making it sort 
     'after any autosaves if only one is 
     'an autosave. 
     Dim xComp As Integer = 4 
     Dim yComp As Integer = 4 

     'If x is an autosave then figure out 
     'which autosave number it is. 
     If Me.Text.StartsWith("autosave") Then 
      Select Case True 
       Case Me.Text.EndsWith("1") 
        xComp = 1 
       Case Me.Text.EndsWith("2") 
        xComp = 2 
       Case Me.Text.EndsWith("3") 
        xComp = 3 
      End Select 
     End If 

     'if y is an autosave then figure out 
     'which autosave number it Is. 
     If y.Text.StartsWith("autosave") Then 
      Select Case True 
       Case y.Text.EndsWith("1") 
        yComp = 1 
       Case y.Text.EndsWith("2") 
        yComp = 2 
       Case y.Text.EndsWith("3") 
        yComp = 3 
      End Select 
     End If 

     Return xComp < yComp 
    End If 
End Function 

答えて

0

まず、1つのポストに2つの質問をすることは良いアイデアではありません。例えば、これらのものをロードするコードやそれらのコードを見ることなく、ロードするのに時間がかかる理由を推測できます。

ソートの場合、CompareToメソッドに欠陥があります。 MSDNから:

同じタイプの他のオブジェクトと現在のインスタンスを比較し、現在のインスタンスが先行するか否かを示す以下の、または他のオブジェクトのようなソート順で同じ位置に発生する整数を返します。

つまり、-1(先行)、1(後続)または0(同じ)を返します。あなたはただブールを返します。

If Me.SaveNumber.ToString.Length > y.SaveNumber.ToString.Length Then 
    Return False 
ElseIf Me.SaveNumber.ToString.Length < y.SaveNumber.ToString.Length Then 
    Return True 
End If 
... 
Return xComp < yComp 

我々はあるが、それは午前整数であるならば、それはを比較すると同じではない場合、文字列形式の長さを比較するどのようなタイプは考えていません:

' Me vs Other 
Return "9".Length < "7".Length 

これは、値によって、1を返さなければならない場合、False(0)を返します。 Option Strictをオンにすると、誤った戻り値の型が指定されている可能性があります。

saveItems = saveItems.OrderBy(Function(q) q.SaveNumber).ToList() 

IComparable.CompareTo()が必要になる可能性があります:あなたはそれ(再びがintであると仮定)が必要さえないかもしれない、

Public Function CompareTo(other As SaveItem) As Integer _ 
        Implements IComparable(Of SaveItem).CompareTo 

    ... special handling for "auto" 

    If Me.SaveNumber = other.SaveNumber Then 
     Return 0 
    ElseIf Me.SaveNumber < other.SaveNumber Then 
     Return -1 
    Else 
     Return 1 
    End If 

End Function 

しかし:それは「自動」の論理を無視して、このようなものでなければなりません"自動保存"ロジックを処理するためには、クラスが公開する情報に応じてOrderBy()で処理することができます。

+0

これは実際に非常に役に立ちます。長さの比較は、19歳から20歳の間に2人にうんざりしていたためです。CompareToを説明してくれてありがとう。私はそれを理解しようとしてきました。私はこのプログラムを書いているので、私は一種の学びです。今私はそれをもっとよく理解していると思います。どうもありがとうございます! –

+0

ああ、私はCompareToを(私が知る限り)行う必要があることを忘れていた。なぜなら、自動セーバーは絶対に上になければならないからだ。 –

+0

2が19と20の間に表示されている場合は、番号の形式でソートしています。 [ascii値](http://www.asciitable.com/)ごとに2> 1なので、 '' 2 "'は '' 19 ''以上です。あなたはNatural Sortを使うことができますが、私はあなたが望むように "auto"のものが出てこないと思っています。自動保存couildはorderbyを使用して行うこともできますが、比較メソッド(IComparableである必要はありません)によって、より洗練されたコードが作成されます。 – Plutonix

関連する問題