45

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

私は次のことを簡単に行うことができます:

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

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

CheckedItemsコレクションを私のリストにキャストするには、もっとエレガントなメソッドが必要です。

4

3 に答える 3

66

これを試してください(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();
于 2009-01-23T02:00:13.103 に答える
16

これはあなたの要件に対する正確な回答ではありませんが、より一般的な回答を投稿してください。さまざまな方法でそれを行うことができます:

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());

リストボックスに約300個のアイテムを使用して複数回実行する10000回の反復の場合、

1) ~100ms

2) ~150ms

3) ~250ms

4) ~260ms

于 2012-07-09T18:18:25.930 に答える
1

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

于 2009-01-23T02:00:58.110 に答える