タイトル : 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 |