gpt4 book ai didi

c# - 将键/值对列表转换为数据表

转载 作者:行者123 更新时间:2023-11-30 12:48:28 25 4
gpt4 key购买 nike

我正在研究解析器。它从源文本中获取值。它事先不知道它将获得多少或哪些值,即变量名称、它们的计数等可能会有很大差异。 source 的每个部分仅提供一些值,而不是完整列表。这些值当前存储在自定义类列表中,类似于 KeyValuePair,但从头开始编写。

示例从源中检索到的内容:

Section 1:
KeyA = ValA1
KeyB = ValB1
KeyD = ValD1
Section 2:
KeyC = ValC2
Section 3:
KeyB = ValB3
KeyD = ValD3

等等

现在,我想以 DataGrid 的形式向用户显示此信息:

| KeyA  | KeyB  | KeyC  | KeyD  |
+-------+-------+-------+-------+
| ValA1 | ValB1 | | ValD1 |
| | | ValC2 | |
| | ValB3 | | ValD3 |

目前,我正在遍历每个部分中找到的所有值,检查列是否存在 - 如果不存在 - 创建新列。如果列存在 - 将值添加到相应的行/列。然后将生成的 DataTable 附加到 DataGrid,如下所示:

dg.ItemSource=dt.AsDataView();

这完全符合预期,但速度太慢。

如果有任何关于如何加快速度的想法,我将不胜感激。初始存储,或转换为 DataTable,或以其他方式绑定(bind)数据以实现相同的呈现给用户。

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 ...

每个部分都有一个方法:

public void CollectValues(DataTable target) {...}

它由带有一些 DataTable 的更高级别的元素调用(最初 - 空的并随着它的进行而被填充)。

每个部分包含内部变量:

private List<CustomValue> Values;

其中包含 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);
}

为什么这个特定部分 - 值只是类似例程的一部分。其他例程在同一数据集上进行类似的爬行,检索其他内容(主要使用列表,没有数据表)——所有这些都几乎立即工作。虽然收集 DataTable 可能需要几秒钟的时间才能让 1 个源填充生成的 DataGrid。

值的平均数量很少超过 1000(例如,10 列乘 100 行)。 DataTable 仅在完全填充后才附加到 DataGrid。

只是关于尺寸的信息:来源——通常是 2 到 10 个文件。每个源文本大小的范围为 100Kb - 100MB。通常的文件大小约为 1-2 MB。后端数据在内存中的大小通常在 100 MB 以下。

并再次强调。只有 DataTable 让我担心。突出显示、分段、源检索、过滤等——所有工作都在我的预期之内。所以我首先要寻找一种方法来优化从键/值对列表到 DataTable 的转换,或者寻找一种最初(在处理后)以不同方式存储这些值以加快处理速度的方法。

希望这能提供足够的信息。目前未列出来源以减小尺寸。

最佳答案

我会寻找除 DataTable 之外的数据结构以在此处使用。在我看来你需要的是 Dictionary<string, Dictionary<int, CustomValue>> . string是您的列名,int是数据行的 ID,CustomValue是数据本身。

public void CollectValues(Dictionary<string, Dictionary<int, CustomValue>> target)
{
foreach(var pair in Values)
{
if(target[pair.Key]==null) target.Add(new Dictionary<int, CustomValue>());
target[pair.Key].Add(pair.ID, pair.Value);
}
foreach(var child in Children)
child.CollectValues(target);
}

如果您还没有 pair.ID在适当的位置,您可以只使用一个计数器变量(static 或在每次调用时传递),以便每个对象都有不同的 ID。


按行存储值可能更有意义,每个数据集都有列,而不是相反。那将是一个 IEnumerable<Dictionary<string, CustomValue>> , 每个Dictionary代表一行。您将使用 target.Select(x => x.Key).Distinct() 提取所有列.

关于c# - 将键/值对列表转换为数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13991674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com