2009-10-14 86 views
50

私はC#を使用し、.NET Framework 3.5をターゲットにしています。私はListBoxの項目をすべてList<String>(一般List)にコピーするための小さくて簡潔で効率的なコードを探しています。ListBox.itemsを汎用リストに変換する最も簡潔な方法

 List<String> myOtherList = new List<String>(); 
     // Populate our colCriteria with the selected columns. 

     foreach (String strCol in lbMyListBox.Items) 
     { 
      myOtherList.Add(strCol); 
     } 

作品、もちろん、しかし、私はこれを行うためのより良い方法がなければならないという感じを助けることが得ることができない:私は以下のコードに似た何かを持っている瞬間

新しい言語機能のいくつか。私はList.ConvertAllメソッドのようなものを考えていましたが、これは汎用リストにのみ適用され、ListBox.ObjectCollectionコレクションには適用されません。

これについてどのように
+0

リストボックス内のオブジェクトは何ですか? – stevehipwell

+0

申し訳ありません - 文字列であることが明示されている必要があります。 – jamiei

+0

拡張メソッドは私が好きなものです – nawfal

答えて

87

LINQのビットそれを行う必要があります: - もちろん

var myOtherList = lbMyListBox.Items.Cast<String>().ToList(); 

あなたがに保存されているものは何でも型にキャストのTypeパラメータを変更することができますItemsプロパティ。

+0

良い答え、ありがとう。 – jamiei

+0

'リスト Mylist =新しいリスト(lbMyListBox.Items.Cast ());'それ以上の違いはありませんか?あなたが別のリストの作成を避けるかどうかという疑問は、私の推測です。 – ThunderGr

5

List<string> myOtherList = (from l in lbMyListBox.Items.Cast<ListItem>() select l.Value).ToList(); 
2

何について:

myOtherList.AddRange(lbMyListBox.Items); 

コメントやDavidGougeの回答に基づいてEDIT:

myOtherList.AddRange(lbMyListBox.Items.Select(item => ((ListItem)item).Value)); 
+0

「System.Windows.Forms.ListBox.ObjectCollection」から「System.Collections.Generic.IEnumerable 」に変換できません –

+0

ObjectCollectionはIEnumerableですが、AddRangeで必要なIEnumerable はありません。 – AnthonyWJones

+0

これは私のためにコンパイルさえしません – nawfal

26

以下は(LINQのを使用して)それを行います。

List<string> list = lbMyListBox.Items.OfType<string>().ToList(); 

OfType呼び出します文字列であるリストボックスの項目内の項目だけが使用されていることを確認してください。

Castを使用すると、いずれかの項目が文字列でない場合、例外が発生します。

+2

それは知っているのは良いことです! :D – DavidGouge

+1

もちろんOfTypeを使用すると、結果のリストに項目がない可能性があります。アイテムのセットが特定のタイプであると予想される場合、間違ったタイプがリストボックスに追加されたバグを隠すことはないので(これは簡単です)、Castを使用します。Additionaly OfTypeは変換演算子を持つアイテムを予想される出力タイプにスキップし、キャストは変換演算子を呼び出します。 – AnthonyWJones

+1

はい。私は本当に "文字列にキャスト可能ではないアイテム"と言わなければなりません。 OfTypeの問題は良い点ですが、ListBoxに文字列のみを含める必要がある場合は、何か他のものが誤って詰まっている場合にクラッシュを停止します。 – adrianbanks

1

これ以上は必要ありません。あなたはリストボックスからすべての値のリストを取得します

private static List<string> GetAllElements(ListBox chkList) 
     { 
      return chkList.Items.Cast<ListItem>().Select(x => x.Value).ToList<string>(); 
     } 
関連する問題