C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 129 を表示中)
■76315 / )  Dynamic や、LinQ の使い方がわかりません。
□投稿者/ よぽん (46回)-(2015/06/24(Wed) 14:50:15)

分類:[.NET 全般] 

お世話になります。

フォームに NumericUpDown を5つ配置しました。
いずれも Minimum = 1, Maximum= 5 に設定し
ValueChanged を nud_ValueChanged にしています。
また、初期値として、
numericUpDown1.Value = 1,
numericUpDown2.Value = 2,
.....
numericUpDown5.Value = 5
にしています。

処理としては
いずれかの NumericUpDown の値を変更すると
他の NumericUpDown の値も同じ値をとらないように
変更するようにしています。


1,2,3,4,5  2番目のデータを4にすると

1,4,2,4,5  4番目のデータが4で重複するのでひとつ下げる
1,4,3,3,5  すると次に3が重複するので
1,4,2,3,5  3番目のデータを2に変更する。

力ずくで作ったのが以下になります。

bool exeflg = false;

void nud_ValueChanged(object sender, EventArgs e)
{
NumericUpDown nudsender = (NumericUpDown)sender;
NumericUpDown nudwork;

// 処理中は何度も ValueChange が呼び出されるので処理されないようにする。
if(exeflg) return;
exeflg = true;

// 変更された numericupdown 以外のリストを作成
NumericUpDown[] nudarray = { numericUpDown1, numericUpDown2, numericUpDown3, numericUpDown4, numericUpDown5 };
List<NumericUpDown> nudlist = new List<NumericUpDown>();
for(int inum = 0; inum < 5; inum++)
{
if(nudarray[inum] != nudsender) nudlist.Add(nudarray[inum]);
}

// 変更された numericupdown 以外のリストからValueでソートして、番号を付け直す
nudarray = nudlist.ToArray();
for(int inum1 = 0; inum1 < nudarray.Count() - 1; inum1++)
{
for(int inum2 = inum1 + 1; inum2 < nudarray.Count(); inum2++)
{
if(nudarray[inum1].Value > nudarray[inum2].Value)
{
nudwork = nudarray[inum1];
nudarray[inum1] = nudarray[inum2];
nudarray[inum2] = nudwork;
}
}
}
for(int inum = 0; inum < nudarray.Count(); inum++) nudarray[inum].Value = inum + 1;

// 変更した numericupdown を挿入して、番号を付け直す
nudlist = new List<NumericUpDown>(nudarray);
for(int inum = 0; inum < nudlist.Count; inum++)
{
if(nudsender.Value <= nudlist[inum].Value)
{
nudlist.Insert(inum, nudsender);
break;
}
}
for(int inum = 0; inum < nudlist.Count; inum++) nudlist[inum].Value = inum + 1;

exeflg = false;
}

ただしいかどうかわかりませんが、一応動作はしています。
しかし、あまりにもスマートじゃないし、何しているかわかりにくいように思います。

Dynamic を使ったり、 LinQ を使ったりするともっと短いコード(数行)で
できそうな気がしますが、Dyanamic も LinQ も使い方がわからず、
動作させることができませんでした。
どのようなコード(プログラム)の書き方ができますか?

このやり方ならもっと他に方法があるとか・・?

お願いします。




返信 編集キー/


管理者用

- Child Tree -