45

我想找到一种更好的方法来从 C# 中的选中列表框中填充通用列表。

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

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

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

必须有一个更 elagent 的方法来将 CheckedItems 集合投射到我的列表中。

4

3 回答 3

66

试试这个(使用 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();
于 2009-01-23T02:00:13.103 回答
16

这不完全是您要求的答案,而是发布了一个更一般的答案。你可以通过多种方式做到这一点:

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

于 2012-07-09T18:18:25.930 回答
1

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

于 2009-01-23T02:00:58.110 回答