我想找到一种更好的方法来填充c#中checkedlistbox的通用列表。
我可以很容易地做到以下几点:
List<string> selectedFields = new List<string>();
foreach (object a in chkDFMFieldList.CheckedItems) {
selectedFields.Add(a.ToString());
}
必须有一个更精细的方法将CheckedItems集合强制转换为我的列表。
答案 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>