C#のチェックリストボックスからジェネリックリストを作成するより良い方法を見つけたいです。
次のことを簡単に行うことができます。
List<string> selectedFields = new List<string>();
foreach (object a in chkDFMFieldList.CheckedItems) {
selectedFields.Add(a.ToString());
}
CheckedItemsコレクションをマイリストにキャストするには、より多くのelagentメソッドが必要です。
これを試してください(System.Linqを使用):
OfType()
は拡張メソッドであるため、System.Linq
を使用する必要があります
List<string> selectedFields = new List<string>();
selectedFields.AddRange(chkDFMFieldList.CheckedItems.OfType<string>());
または、1行で実行します。
List<string> selectedFields = chkDFMFieldList.CheckedItems.OfType<string>().ToList();
これは厳密にあなたの要件に対する答えではありませんが、より一般的な答えを投稿します。さまざまな方法で行うことができます。
1)
T[] items = new T[lb.Items.Count];
lb.Items.CopyTo(items, 0);
var lst = new List<T>(items);
2)あなたが言ったようにforeach
を使用してループと追加を行います。
3)Linqの使用
var lst = lb.Items.Cast<T>().ToList();
4)または
var lst = lb.Items.OfType<T>().ToList();
以下のようなパフォーマンステストを行ったところ、配列メソッドへのコピーが最も速く、Linqメソッドの方が遅いことがわかりました。もちろん、実際のシナリオでは、これらは重要ではありません。私は読みやすさのために3番目の方法(Linq)を好みます。
DateTime d = DateTime.Now;
for (int i = 0; i < 10000; i++)
{
Action();
}
MessageBox.Show((DateTime.Now - d).TotalMilliseconds.ToString());
10000回の反復の場合、リストボックスに約300のアイテムを複数回実行し、
1)〜100ms
2)〜150ms
3)〜250ms
4)〜260ms
LINQにアクセスできない場合は、selectedFieldsコレクションにデータを追加することに加えて、リストアイテムに対して2番目の操作(ToString()
を呼び出す)を実行するため、よりエレガントな方法はありません。