如何在C#中更快地逐行列?

时间:2010-05-10 15:11:37

标签: c# optimization datatable

我有一个DataTable,其列值和列名称有30000行。现在我想从Value指定的行中获取非常快的Name。怎么这么快?我有40000个具有各种值的请求到这个表。

我对C#中的解决方案和数据库端的感兴趣。

6 个答案:

答案 0 :(得分:3)

假设您已经拥有DataTable,您可以这样做:

DataRows row = MyDataTable.Select("Value = 7")[0];
string name = (string)row["name"];

当然,如果您仅为此目的检索DataTable,最好只从数据库中选择所需的数据。如果这是您保留在内存中的数据,那么我建议您使用JMarsch建议使用字典。

答案 1 :(得分:3)

数据表中的数据来自哪里?对数据表进行过滤,而不是将整个数据库表格检索到数据表然后在那里进行过滤,总是更快。它在数据库中快了几个数量级。

答案 2 :(得分:3)

您可以使用DataView,并将排序顺序设置为键。这将导致构建内存索引。

然而如果这只是一个只有一个键和一个值的简单数据表,我建议您使用Dictionary< TKey,TValue>或者改为HashTable。使用Dictionary可以获得更好的性能(在测试中,我们已经将数百万个项目加载到字典中,并获得了亚秒查找 - 查找的性能是O(1)或O(logn),我可以'记住哪个 - 无论哪种方式,它都很快疯狂。

答案 3 :(得分:1)

不要使用DataTable - 使用请求命中数据库。认真。你想要一些带有索引的东西,它被优化用于处理它认为的少量数据。

答案 4 :(得分:1)

您可以使用几种方法进行客户端搜索:

  1. 使用DataView

    DataView view = new DataView(table);
    view.Sort = "Value asc";
    int index = view.Find(value);
    // you now have the index of the row in question, or -1 if it was not found
    
  2. 使用Dictionary。这会更快,但需要更多的工作预先和维护。假设Value是整数列而Name是字符串,

    Dictionary<int, string> lookup = table.Rows.ToDictionary(
        r => (int)r["Value"], 
        r => (string)r["Name"]);
    string name = lookup[value];
    

    或者,如果可能存在不存在的值,

    string name;
    if(lookup.TryGetValue(value, out name)) ...
    
  3. 这两个选项都相当快,但Dictionary可能会更快。唯一的缺点是,在发生更改时,您必须与表保持同步(假设可以发生更改)。

    显然,数据库本身更容易进行此过滤,但我会决定是否应该在客户端为您完成此操作。

答案 5 :(得分:1)

在.Net中,DataTables是昂贵的结构。字典是一种更简单,更有效的结构。您可以这样定义:

    System.Collections.Generic.Dictionary<string, string> nameValueList = new Dictionary<string, string>();

然后你可以像这样加载它:

nameValueList.Add("name1", "value1");

...假设名称是唯一的,否则你会得到'ArgumentException' 最后你可以调用这样的值:

string res = nameValueList["name1"];

我认为这是最快的实现之一,如果预期的事务数量证明了转换数据的初始开销是合理的。