I want to find a better way of populating a generic list from a checkedlistbox in c#.
I can do the following easily enough:
List<string> selectedFields = new List<string>();
foreach (object a in chkDFMFieldList.CheckedItems) {
selectedFields.Add(a.ToString());
}
There must be a more elagent method to cast the CheckedItems collection to my list.
Try this (using System.Linq):
OfType()
is an extension method, so you need to use System.Linq
List<string> selectedFields = new List<string>();
selectedFields.AddRange(chkDFMFieldList.CheckedItems.OfType<string>());
Or just do it in one line:
List<string> selectedFields = chkDFMFieldList.CheckedItems.OfType<string>().ToList();
This is not exactly the answer to your requirement, but posting a more general answer. You could do it in a variety of ways:
1)
T[] items = new T[lb.Items.Count];
lb.Items.CopyTo(items, 0);
var lst = new List<T>(items);
2) looping and adding using foreach
as you mentioned.
3) using Linq
var lst = lb.Items.Cast<T>().ToList();
4) or
var lst = lb.Items.OfType<T>().ToList();
When I did some performance testing like below, I found copying to array method the fastest while the Linq methods slower. Of course in real world scenarios these wouldnt matter. I prefer the 3rd method (Linq) for readability.
DateTime d = DateTime.Now;
for (int i = 0; i < 10000; i++)
{
Action();
}
MessageBox.Show((DateTime.Now - d).TotalMilliseconds.ToString());
For an iteration of 10000 times run multiple times with about 300 items in list box,
1) ~100ms
2) ~150ms
3) ~250ms
4) ~260ms
If you don't have access to LINQ then there isn't a more elegant way since you're performing a second operation on the list items (calling ToString()
) in addition to populating the selectedFields collection.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With