将项目集合从列表框转换为通用列表

时间:2009-01-23 01:54:28

标签: c# list casting listbox

我想找到一种更好的方法来填充c#中checkedlistbox的通用列表。

我可以很容易地做到以下几点:

List<string> selectedFields = new List<string>();

foreach (object a in chkDFMFieldList.CheckedItems) {
         selectedFields.Add(a.ToString());
         } 

必须有一个更精细的方法将CheckedItems集合强制转换为我的列表。

3 个答案:

答案 0 :(得分:52)

试试这个(使用System.Linq):

OfType()是一种扩展方法,因此您需要使用System.Linq

List<string> selectedFields = new List<string>();
selectedFields.AddRange(chkDFMFieldList.CheckedItems.OfType<string>());

或者只是一行:

List<string> selectedFields = chkDFMFieldList.CheckedItems.OfType<string>().ToList();

答案 1 :(得分:12)

这不是您要求的答案,而是发布更一般的答案。你可以用各种方式做到这一点:

1)

T[] items = new T[lb.Items.Count];
lb.Items.CopyTo(items, 0);
var lst = new List<T>(items);

2)如你所述,使用foreach进行循环和添加。

3)使用Linq

var lst = lb.Items.Cast<T>().ToList();

4)或

var lst = lb.Items.OfType<T>().ToList();

当我进行如下的性能测试时,我发现复制到数组方法最快,而Linq方法速度较慢。当然,在现实世界的场景中,这些并不重要。为了便于阅读,我更喜欢第三种方法(Linq)。

DateTime d = DateTime.Now;
for (int i = 0; i < 10000; i++)
{
    Action();
}
MessageBox.Show((DateTime.Now - d).TotalMilliseconds.ToString());

对于10000次的迭代,在列表框中运行多次300个项目,

1)~100ms

2)~150ms

3)~250ms

4)~260ms

答案 2 :(得分:1)

如果您无法访问LINQ,那么除了填充selectedFields集合之外,您还没有更优雅的方式,因为您在列表项(调用ToString())上执行第二次操作。 / p>