【问题标题】:C# - winforms - getting texts of specific column in listview in form of an arrayC# - winforms - 以数组的形式获取列表视图中特定列的文本
【发布时间】:2011-06-09 02:53:53
【问题描述】:

是否可以在不使用循环函数的情况下以数组的形式获取列表视图中特定列的文本值?假设我有一个包含 2 列和 5000 条记录的列表视图。我想要的是仅获取第 2 列下的所有文本,但不使用循环。我知道我可以通过循环来完成此操作,但如果我有 5000 多条记录,则需要很长时间..

有什么想法吗?

【问题讨论】:

  • 控件中的数据来源是什么?

标签: c# winforms arrays listview


【解决方案1】:

我感受到你的痛苦,我亲身体验过ListViewItemsCollection 的速度有多慢。

可以在没有这样的 for 循环的情况下访问 ListView 的第二列:

string[] column1 = this.listView1.Items.Cast<ListViewItem>().Select(item => item.SubItems[1].Text).ToArray();

但这并不比 for 循环快。事实上,它有点慢!尝试使用ListViewItemsCollection.CopyTo 等其他技巧也失败了。

ListView 的一个主要问题是,当用作数据结构时,它的速度非常慢。 ListView.Items 属性 看起来 像一个数据结构,您可以像数据结构一样使用它,但可以以任何方式对其进行切片:

  • 数据输入,但 输出速度不快

因此,如果您遵循 alexD 的建议,您会发现 真实 数据结构的性能将优于 ListViewItemCollection 几个数量级。这个故事的寓意是,如果您想快速查询ListViewItemCollection 中的数据,您别无选择,只能保留ListView 的快速副本外部。实际上任何数据结构都可以,例如

  • string[][]
  • string[,]
  • List&lt;List&lt;string&gt;&gt;
  • List&lt;string[]&gt; 甚至
  • List&lt;Tuple&lt;string, string&gt;&gt;

这些都可以将相同的数据存储为两列 ListView,并且与使用 ListView 作为数据结构相比,它们的速度会很快。这很不方便,但这是我们必须为速度付出的代价。

【讨论】:

  • 感谢您清除这个.. 我认为有一个很好的方法可以做到这一点.. 无论如何我将使用另一个线程来完成整个循环.. 我认为这是最简单的方法。 .
  • 这是个好主意,但不幸的是,您不能使用另一个线程来加速它,因为不允许后台线程访问 WinForms 用户界面对象,例如ListView
  • 我将 ListViewItems 从 ListView 控件复制到一个数组。然后将该数组传递给一个新线程。就是这样。刚刚实现它,它真的像魅力一样工作:)跨度>
【解决方案2】:

不要将数据直接从文本文件读取到列表视图中...将其存储在像ArrayList 这样的数据结构中,它将保持插入元素的顺序。

【讨论】:

  • 伙伴我只从文本文件中读取数据一次(当程序运行时)......所以这不是问题......
  • 是的,但是如果你先把它读入一个数据结构中,那么你以后就不用担心将列从ListView中拉出来了。你已经从 getgo 中得到了你的字符串数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-30
  • 2021-05-27
  • 1970-01-01
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多