Most succinct way to convert ListBox.items to a generic list

66,045

Solution 1

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.

Solution 2

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.

Solution 3

How about this:

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

Solution 4

What about:

myOtherList.AddRange(lbMyListBox.Items);

EDIT based on comments and DavidGouge's answer:

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

Solution 5

You don't need more. You get List of all values from Listbox

private static List<string> GetAllElements(ListBox chkList)
        {
            return chkList.Items.Cast<ListItem>().Select(x => x.Value).ToList<string>();
        }
Share:
66,045
jamiei
Author by

jamiei

Java, Clojure, Python, and Ruby. Hobby Delphi and Oxygene developer. Always happy to learn and to be corrected if/when I'm wrong.

Updated on January 28, 2020

Comments

  • jamiei
    jamiei over 4 years

    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.

  • Wael Dalloul
    Wael Dalloul over 14 years
    it will give the following error: cannot convert from 'System.Windows.Forms.ListBox.ObjectCollection' to 'System.Collections.Generic.IEnumerable<string>'
  • AnthonyWJones
    AnthonyWJones over 14 years
    ObjectCollection is IEnumerable but not IEnumerable<T> which is required by AddRange.
  • AnthonyWJones
    AnthonyWJones over 14 years
    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.
  • adrianbanks
    adrianbanks over 14 years
    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
  • jamiei
    jamiei over 14 years
    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.
  • nawfal
    nawfal almost 12 years
    this doesnt even compile for me
  • ThunderGr
    ThunderGr over 10 years
    Is List<String> Mylist = new List<String>(lbMyListBox.Items.Cast<String>()); better or it makes no difference? The question, I guess, is if, this way, you avoid the creation of another list or not.