English 中文(简体)
将列表框中的项目集转换为通用列表。
原标题:
  • 时间:2009-01-23 01:54:27
  •  标签:

我想找到一种更好的方式来从C#中的CheckedListBox填充一个通用列表。

我可以轻松地做到以下事情:

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

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

必须有一种更优雅的方法将 CheckedItems 集合转换为我的列表。

最佳回答

尝试一下(使用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)(无法翻译,缺少翻译内容)

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

2)循环并使用foreach添加,正如您所提到的。

使用Linq

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

或者

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

约150毫秒

~250毫秒

约260毫秒

如果您无法使用LINQ,则没有更优雅的方法,因为您需要对列表项执行第二个操作(调用ToString()),并且需要填充selectedFields集合。





相关问题
热门标签