Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在数据表中查找值的最佳性能?对于林克?另外_C#_.net_Performance_Linq_Datatable - Fatal编程技术网

C# 在数据表中查找值的最佳性能?对于林克?另外

C# 在数据表中查找值的最佳性能?对于林克?另外,c#,.net,performance,linq,datatable,C#,.net,Performance,Linq,Datatable,我在c程序的数据表中加载了一个大的txt文件 我需要在这个数据表中搜索几个值 目前我使用的是一个简单的For循环,而且它很长! 我真的需要争取时间 有没有更好的方法来执行此操作?使用Linq?还是另一种方法 以下是我的代码的基本示例: foreach (DataRow row in DataTables[0].Rows) { for (int i = 0; i <= DataTables[1].Rows.Count - 1; i++) { if ((Da

我在c程序的数据表中加载了一个大的txt文件

我需要在这个数据表中搜索几个值

目前我使用的是一个简单的For循环,而且它很长! 我真的需要争取时间

有没有更好的方法来执行此操作?使用Linq?还是另一种方法

以下是我的代码的基本示例:

foreach (DataRow row in DataTables[0].Rows) 
{
    for (int i = 0; i <= DataTables[1].Rows.Count - 1; i++)
    {

        if ((DataTables[1].Rows[i]["PRODUCT_CODE"].ToString().Trim() == row["PRODUCT_CODE"].ToString().Trim())
        {
            // Do Some Stuff
            // When the value is found, don't break the for...continue because there is severals "PRODUCT_CODE", not once.
        } 
    }
}

一个简短的示例使用多个作为一个核心

Parallel.ForEach(dt.AsEnumerable(), row =>
{
    if (i["value1"].ToString() == "test")
    {
        Console.WriteLine(i["value1"]);
    }
});
其他解决方案

比较关键点非常快

Dictionary<string, Product> file1 = new Dictionary<string, Product>();
Dictionary<string, Product> file2 = new Dictionary<string, Product>();

//Add ProductCode in key

var product = new Product();
product.Code = "EAN1202";
product.Manufacturer = "Company";
product.Name = "Test";
product.Price = 12.05;

file1.Add(product.Code, product);

//One thread
foreach (var item in file1)
{
   if (file2.ContainsKey(item.Key))
   {
      // Do Some Stuff
   }
}

//Multi thread
Parallel.ForEach(file1, item =>
{
   if (file2.ContainsKey(item.Key))
   {
      // Do Some Stuff
   }
});
刚从On^m转到On+m

如果需要整行,则使用字典而不是哈希集

Dictionary<String, DataRow> dt0 = new Dictionary<String, DataRow>(); 
您应该使用HashSet/Dictionary来表示更大的值

我会给你更多,但你竟无礼地问我是否认为这会更快


为什么首先要使用DataTables?

如果我们知道您在循环中所做的工作,这可能会更好一些,但这应该是可行的:

var dt1=DataTables[0].Rows.AsEnumerable();
var dt2=DataTables[1].Rows.AsEnumerable();
var results=dt1.Join(
  dt2,
  d1=>d1.Field<string>("PRODUCT_CODE").Trim(),
  d2=>d2.Field<string>("PRODUCT_CODE").Trim(),
  (d1,d2)=>new {d1,d2});
foreach(var row in results)
{
  // Do stuff with row.d1/row.d2
}


例如,如果您的数据表是从SQL源创建的,那么最好在该源上使用join,这将允许SQL server进行连接,而不是在客户端进行连接。另外,不使用datatables和使用POCO类将提高性能,并且在连接过程中不需要装箱/取消装箱产品代码。

问题是数据的结构如何?为了更高效地搜索,您能否更好地对其进行重组?关于是否使用linq或for循环的争论无关紧要。如果您只想搜索特定的值,那么在找到值后for循环更好,请中断循环。希望它对youDataTable有帮助。选择它,它不是linq,而是类的本机方法。为什么不现在发布执行搜索的代码呢?如果你想知道哪匹马跑得最快,这是了解什么可以优化的必要条件。。。与他们竞争如果性能是你的目标,linq将不是答案…因为我在datagridview中显示它,更容易以可视化方式调试!是的,我需要整排人。你认为会更快吗?不,我只是在胡乱猜测。完全从On^m到On+m。你的循环很简单。你想要速度还是简单?因为DataTable不是最快的。对不起,狗仔队,我不会无礼的。我真的很抱歉,非常感谢您的帮助。您好,我想我不能使用您的方法,因为我可以多次使用相同的产品代码,因此,它不是唯一的密钥。我想我也使用了for循环作为parralel。我认为有很多东西你不能使用。在另一篇评论中,你说这是独一无二的。您可以使用Dictionarystring、ListDataRows,但我已经厌倦了尝试帮助您。您好,谢谢您的回答。您的代码是否适用于两个数据表?我用我的代码编辑了我的问题,如果你需要理解的话。再次感谢:另一个问题…关于我的文件2。产品代码不是主键。有几个相同的产品代码。我需要尽可能多地迭代。你的代码可以这样吗?它会比他拥有的更快,但不会像我想的那样使用哈希集那么快。我不相信LINQ在进行连接时会在内部使用哈希集,但我可能是错的。当然,这在很大程度上也取决于数据的形状。如果dt1有1-3条记录,而dt2有m |十亿条记录,那么哈希集不会有多大帮助,除非它被反转。他正在阅读一个文本文件,而实际上他似乎没有尝试任何建议的答案。哎呀,我错过了文本文件部分。如果他在读取文件时处理该文件,而不是将其加载到数据表中,可能会更好。@RobertMcKee LINQ在执行联接时确实使用内部轻量级哈希集。如果不是这样,我会非常惊讶:
Dictionary<String, DataRow> dt0 = new Dictionary<String, DataRow>(); 
var dt1=DataTables[0].Rows.AsEnumerable();
var dt2=DataTables[1].Rows.AsEnumerable();
var results=dt1.Join(
  dt2,
  d1=>d1.Field<string>("PRODUCT_CODE").Trim(),
  d2=>d2.Field<string>("PRODUCT_CODE").Trim(),
  (d1,d2)=>new {d1,d2});
foreach(var row in results)
{
  // Do stuff with row.d1/row.d2
}