C# 在数据表中查找值的最佳性能?对于林克?另外
我在c程序的数据表中加载了一个大的txt文件 我需要在这个数据表中搜索几个值 目前我使用的是一个简单的For循环,而且它很长! 我真的需要争取时间 有没有更好的方法来执行此操作?使用Linq?还是另一种方法 以下是我的代码的基本示例: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
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
}