web-dev-qa-db-ja.com

ListBox.itemsを汎用リストに変換する最も簡潔な方法

C#を使用し、.NET Framework 3.5をターゲットにしています。 ListBox のすべての項目をList<String>(Generic List )にコピーするための、小さく簡潔で効率的なコードを探しています。

現時点では、次のコードに似たものがあります:

        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 コレクションには適用されません。

57
jamiei

少しLINQがそれを行う必要があります:-

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

もちろん、CastのTypeパラメーターを、Itemsプロパティに保存したタイプに変更できます。

105
AnthonyWJones

以下はそれを行います(Linqを使用):

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

OfType 呼び出しは、リストボックスのアイテム内の文字列であるアイテムのみが使用されるようにします。

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

27
adrianbanks

これはどう:

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

どうですか:

myOtherList.AddRange(lbMyListBox.Items);

コメントとDavidGougeの答えに基づいて編集:

myOtherList.AddRange(lbMyListBox.Items.Select(item => ((ListItem)item).Value));
2
Konamiman

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

private static List<string> GetAllElements(ListBox chkList)
        {
            return chkList.Items.Cast<ListItem>().Select(x => x.Value).ToList<string>();
        }
1
iruisoto