tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: 効率的なパンデジタル数作成方法が分かりません
投稿日: 2017/04/18(Tue) 18:11
投稿者魔界の仮面弁士
> 10桁のパンデジタル数を作るとなると処理時間が膨大です。

ListBox を使う以上、実用に耐える速度にはならないでしょう。
BeginUpdate/EndUpdate を併用したとしても、
せいぜい 32K 件程度が許容限界かと。


とりあえず、仮想リストビューに表示させてみました。
ListView、Button、CheckBox を貼っておいてください、


======= Form =======
Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'Dim CH As Char() = "1".ToCharArray()
        'Dim CH As Char() = "12".ToCharArray()
        'Dim CH As Char() = "123".ToCharArray()
        'Dim CH As Char() = "1234".ToCharArray()
        'Dim CH As Char() = "12345".ToCharArray()
        Dim CH As Char() = "123456".ToCharArray()
        'Dim CH As Char() = "1234567".ToCharArray()
        'Dim CH As Char() = "12345678".ToCharArray()
        'Dim CH As Char() = "123456789".ToCharArray()
        'Dim CH As Char() = "1234567890".ToCharArray()

        Cursor.Current = Cursors.WaitCursor
        Dim q = CH.GetPermutation()

        '先頭が0で始まる数字を取り除くか?
        If CheckBox1.Checked Then
            q = q.Where(Function(c) c(0) <> "0"c)
        End If

        pandigital = q.Select(Function(c) New String(c)).ToArray()

        ListView1.VirtualListSize = pandigital.Length
        Cursor.Current = Cursors.Default

        MsgBox("検出件数:" & pandigital.Length.ToString("#,0"), MsgBoxStyle.Information)
    End Sub

    Private pandigital(-1) As String

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ListView1.VirtualMode = True
        ListView1.Columns.Add("Text")
        ListView1.View = View.Details
        ListView1.VirtualListSize = 0
    End Sub

    Private Sub ListView1_RetrieveVirtualItem(sender As Object, e As RetrieveVirtualItemEventArgs) Handles ListView1.RetrieveVirtualItem
        If e.ItemIndex < pandigital.Length Then
            If e.Item Is Nothing Then
                e.Item = New ListViewItem()
            End If
            e.Item.Text = pandigital(e.ItemIndex)
        End If
    End Sub
End Class



======= Module =======
Module PermutationExtensions
    <System.Runtime.CompilerServices.Extension()> _
    Public Function GetPermutation(Of T)(this As T()) As IEnumerable(Of T())
        If this.Length = 1 Then
            Return New T()() {this}
        Else
            Return this.SelectMany( _
                Function(v) GetPermutation(this.Except(New T() {v}).ToArray()), _
                Function(v, p) New T() {v}.Concat(p).ToArray())
        End If
    End Function
End Module




なお、1133 のように、同じ文字が含まれるようなパターンについては考慮していません。
同じ文字を含むケース(11 桁以上の 10 進数など)にも対応させるのであれば、
下記が参考になるかもしれません。VB ではなく C# ですけれども。
http://d.hatena.ne.jp/taguo/20080722/1216745650

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)
おなまえ
タイトル (できるだけ短く簡潔に)
メッセージ   図表モード   注意! 全角で40文字以内 (下記テキストボックスの範囲内) 【改行処理】 を必ずして下さい。   【マルチポスト】(複数の掲示板で同じ質問をする事) 【返信】(お礼) のできない方の投稿は、お断りします。 [注意事項]をよく読んでから投稿して下さい。    URLの投稿 は、最初の1文字を除いて ttp://hanatyan.sakura.ne.jp/ のようにして投稿して下さい。
暗証キー (英数字で8文字以内)
投稿キー (投稿時 投稿キー を入力してください)
  • 当掲示板をご利用になる場合は、必ず【掲示板ご利用に際し】をよく読んでからご利用願います。

  •   プレビュー
  • 質問される前に【当サイト内外の検索】を使って下調べをして下さい。

  • ★★★ 下記から自分の投稿記事を[修正]することができます ★★★
    処理 記事No 暗証キー
      累計    本日 昨日
    [.NET用掲示板] [VB6.0用掲示板] [サンプル投稿用掲示板] [雑談用掲示板]   [ツリー表示へ] [注意事項] [ワード検索] [Home]