web-dev-qa-db-ja.com

リストボックスからジェネリックリストへのアイテムコレクションのキャスト

C#のチェックリストボックスからジェネリックリストを作成するより良い方法を見つけたいです。

次のことを簡単に行うことができます。

List<string> selectedFields = new List<string>();

foreach (object a in chkDFMFieldList.CheckedItems) {
         selectedFields.Add(a.ToString());
         } 

CheckedItemsコレクションをマイリストにキャストするには、より多くのelagentメソッドが必要です。

38
Alex

これを試してください(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();
58
Matt Hamilton

これは厳密にあなたの要件に対する答えではありませんが、より一般的な答えを投稿します。さまざまな方法で行うことができます。

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

13
nawfal

LINQにアクセスできない場合は、selectedFieldsコレクションにデータを追加することに加えて、リストアイテムに対して2番目の操作(ToString()を呼び出す)を実行するため、よりエレガントな方法はありません。

1
Ken Browning