che*_*sun 5 c# wpf datagrid .net-4.5
我正在研究解析器。它从源文本中获取值。它事先并不知道它将获得多少个或哪些值,即变量的名称、它们的计数等可能会有很大差异。源代码的每个部分仅提供一些值,而不是完整列表。这些值当前存储在自定义类的列表中,类似于 KeyValuePair,但从头开始编写。
从源检索到的内容示例:
Section 1:
KeyA = ValA1
KeyB = ValB1
KeyD = ValD1
Section 2:
KeyC = ValC2
Section 3:
KeyB = ValB3
KeyD = ValD3
Run Code Online (Sandbox Code Playgroud)
ETC。
现在,我想以 DataGrid 的形式向用户显示此信息:
| KeyA | KeyB | KeyC | KeyD |
+-------+-------+-------+-------+
| ValA1 | ValB1 | | ValD1 |
| | | ValC2 | |
| | ValB3 | | ValD3 |
Run Code Online (Sandbox Code Playgroud)
目前,我正在迭代每个部分中找到的所有值,检查列是否存在 - 如果不存在 - 创建新列。如果列存在 - 向相应的行/列添加值。然后将生成的 DataTable 附加到 DataGrid,如下所示:
dg.ItemSource=dt.AsDataView();
Run Code Online (Sandbox Code Playgroud)
这完全符合预期,但是太慢了。
如果有任何关于如何加快速度的想法,我将不胜感激。初始存储,或转换为 DataTable,或绑定数据的其他方式,以实现向用户提供相同的呈现。
C#、WPF、.NET 框架 4.5
更新:所有加载和处理都是预先完成的。就绪数据存储为已处理部分的树。作为属性之一的每个部分都包含一个键/值对列表。每个部分都有类来用它的值填充给定的 DataTable。
即后端数据如下所示:
File1
+ Section 1 on level 1
| + Section 1
| + Section 2
+ Section 2 on level 1
+ Section 3 on level 1
| + Section 1
| + Section 2
| + Section 3
| + Section 4
+ Section 4
File2 ...
Run Code Online (Sandbox Code Playgroud)
每个部分都有一个方法:
public void CollectValues(DataTable target) {...}
Run Code Online (Sandbox Code Playgroud)
它由具有某些 DataTable 的更高级别元素调用(最初 - 为空,然后逐渐填充)。
每个部分包含内部变量:
private List<CustomValue> Values;
Run Code Online (Sandbox Code Playgroud)
它保存 CustomValue 类中所有已找到和处理的值。CustomValue ~= KeyValuePair,但添加了处理例程。
因此,发生的情况是从请求的级别(可能是顶部,也可能是任何其他级别)调用 CollectValues,并使用空的未准备的 DataTable。CollectValues 迭代(foreach)当前级别列表中的所有可用值,并将它们一次添加到目标 DataTable 1,然后检查 DataColumn 是否存在所需名称 (target[Value.Key]!=null) - 并创建列如果需要的话,在尝试添加相应的值之前。在元代码中:
public void CollectValues(DataTable target)
{
DataRow dr = target.Rows.Create();
foreach(var pair in Values)
{
if(target[pair.Key]==null) target.Columns.Add(...);
dr[pair.Key] = pair.Value;
}
foreach(var child in Children)
child.CollectValues(target);
}
Run Code Online (Sandbox Code Playgroud)
为什么这个特定部分 - 值只是类似例程的一部分。其他例程在同一数据集上进行类似的爬行,检索其他内容(主要使用列表,没有数据表) - 所有这些都几乎立即工作。不过,收集 DataTable 可能需要几秒钟的时间才能填充 1 个源的结果 DataGrid。
值的平均数量很少超过 1000 个(例如 10 列 x 100 行)。DataTable 仅在完全填充后才附加到 DataGrid。
仅提供有关大小的信息:来源 - 通常 2 到 10 个文件。每个源文本大小的范围可以是 100Kb - 100 MB。通常的文件大小约为 1-2 MB。内存中后端数据的大小通常在 100 MB 以下。
并再次强调。只有 DataTable 让我担心。突出显示、分段、源检索、过滤等——所有这些都在我的预期之内。因此,我首先正在寻找一种方法来优化从键/值对列表到 DataTable 的转换,或者寻找一种最初(处理后)以不同方式存储这些值以加快处理速度的方法。
希望这能提供足够的信息。目前未列出源以缩小尺寸。
数据表速度很慢。它做了很多事情。
如果你们都是字符串那么我会创建一个集合
List<String> ColNames;
List<String> ColValues;
List<ColValues> RowsColValues;
Run Code Online (Sandbox Code Playgroud)
然后,您需要使用 ColValues[i] 语法手动将列绑定到 DataGrid。
为了提高速度,请使用 ListView GridView 。
与 Gridview 相比,DataGrid 速度慢且体积大。
但 GridView 不进行编辑。
这不是编出来的。
我正是这么做的,但场景不同。
用户选择他们想要查看的列。
| 归档时间: |
|
| 查看次数: |
7552 次 |
| 最近记录: |