同様の質問についてstackoverflowとWebを検索しましたが、必要な解決策が見つかりませんでした。
コードリストジェネレーターをプログラミングしています。
たとえば、のような文字のリストがありList<char> { 'a', 'b', 'c' };
ます。
とのよう(int)minLength
な設定がいくつかあります。2
(int)maxLength
3
そして、私はこの出力が欲しい:
aa
ab
ac
ba
bb
bc
ca
cb
cc
aaa
aab
aac
aba
abb
abc
aca
acb
acc
baa
bab
bac
bba
bbb
bbc
bca
bcb
bcc
caa
cab
cac
cba
cbb
cbc
cca
ccb
ccc
一般的には、多次元ループを作成するだけですが、minLength、maxLength、charList の値が異なるため、これを動的に行う必要があります。
だから私はこの例のような「自己呼び出し関数」を使っていました:
private void loop() {
for( int i = 0; i < num; i++ ) {
// stuff
loop();
}
}
これまでのところ、次の一連のコードを作成しましたが、この段階で行き詰まります... :
Thread mainThread;
List<char> azlower;
List<char> azupper;
List<char> nullnine;
List<char> totalChars;
int totalNum;
int levelCounter;
bool running;
public Form1() {
InitializeComponent();
}
private void init() {
azlower = new List<char> { 'a', 'b', 'c' , 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
azupper = new List<char> { 'A', 'B', 'C' , 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
nullnine = new List<char> { '0', '1', '2' /* , '3', '4', '5', '6', '7', '8', '9' */ };
totalChars = new List<char> ();
running = false;
}
private void button1_Click( object sender, EventArgs e ) {
if( !running ) {
init();
// Start
if( checkBoxAZ1.Checked ) {
foreach( char character in azlower ) {
totalChars.Add( character );
}
}
if( checkBoxAZ2.Checked ) {
foreach( char character in azupper ) {
totalChars.Add( character );
}
}
if( checkBox09.Checked ) {
foreach( char character in nullnine ) {
totalChars.Add( character );
}
}
if( checkBoxS.Checked && textBoxSpec.Text != "" ) {
char[] specArray = textBoxSpec.Text.ToCharArray();
foreach( char character in specArray ) {
totalChars.Add( character );
}
}
totalNum = totalChars.Count;
levelCounter = Int32.Parse( textBoxMinLength.Text );
mainThread = new Thread( new ThreadStart( run ) );
button1.Text = "Stop";
running = true;
mainThread.Start();
} else {
mainThread.Abort();
button1.Text = "Start";
running = false;
}
}
private void run() {
for( int i = 0; i < totalNum; i++ ) {
Invoke( ( MethodInvoker ) delegate {
write( totalChars[ i ].ToString() );
if( i == totalNum - 1 && levelCounter == Int32.Parse( textBoxMaxLength.Text ) ) {
write( "\n" );
}
} );
if( levelCounter < Int32.Parse( textBoxMaxLength.Text ) ) {
levelCounter++;
run();
}
}
return;
}
private void write( string line ) {
richTextBox1.Text += line;
}
しかし、上記のセットアップと私のコードでは、出力は次のようになります。
aabc
bc
私はちょうど考え違いをしたと思いますね。
みんな、私に何か提案はありますか?
私はデカルト積も見ましたが、1つの配列だけでは機能しないと思いました...
任意の助けのためのthx。