views:

807

answers:

4

I am using C# and targeting the .NET Framework 3.5. I'm looking for a small, succinct and efficient piece of code to copy all of the items in a ListBox to a List<String> (Generic List).

At the moment I have something similar to the below code:

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

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

Which works, of course, but I can't help but get the feeling that there must be a better way of doing this with some of the newer language features. I was thinking of something like the List.ConvertAll method but this only applies to Generic Lists and not ListBox.ObjectCollection collections.

A: 

How about this:

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

A bit of LINQ should do it:-

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

Of course you can modify the Type parameter of the Cast to whatever type you have stored in the Items property.

AnthonyWJones
Good answer, thanks.
jamiei
A: 

What about:

myOtherList.AddRange(lbMyListBox.Items);

EDIT based on comments and DavidGouge's answer:

myOtherList.AddRange(lbMyListBox.Items.Select(item => ((ListItem)item).Value));
Konamiman
it will give the following error: cannot convert from 'System.Windows.Forms.ListBox.ObjectCollection' to 'System.Collections.Generic.IEnumerable<string>'
Wael Dalloul
ObjectCollection is IEnumerable but not IEnumerable<T> which is required by AddRange.
AnthonyWJones
+6  A: 

The following will do it (using Linq):

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

The OfType call will ensure that only items in the listbox's items that are strings are used.

Using Cast, if any of the the items are not strings, you will get an exception.

adrianbanks
That's good to know! :D
DavidGouge
Of course by using OfType the resulting list may be missing items. If the set of items are expected to be of a specific type use Cast since it doesn't hide a bug where the wrong types have been added to the ListBox (which is easy to do). Additionaly OfType will skip items that have a Conversion operator to the expected output type whereas Cast will invoke the converter operator.
AnthonyWJones
Yes. I should really have said "items that are not castable to strings". The OfType issue is a good point, but if the ListBox should only contain strings, it will stop a crash in the case where something else erroneously creeps in
adrianbanks
I'm expecting the listbox to be filled with strings but in the case of a non-string object being placed in the listbox, I would rather silently skip that item than cause an exception and deal with that exception in much the same way.
jamiei
Ender up using this answer, thanks adrianbanks!
jamiei