筛选项使用C#HashSet复制客户端
目前我遇到的问题是,我需要过滤客户端上SQL查询的结果。可返回的数据量介于筛选项使用C#HashSet复制客户端,c#,client,hashset,C#,Client,Hashset,目前我遇到的问题是,我需要过滤客户端上SQL查询的结果。可返回的数据量介于5和50.000.000之间。对于每个项目,都有1和5重复项 我的第一个想法是,将一个项目的每个主键存储在散列集中并进行证明,不管它是否已经存在。如果一个sql语句包含多个主键,我会用下划线或类似的符号来表示它们 但我不确定这是否是最有效的方法。有什么比将每个主键存储在哈希集中更好的方法吗 注意:很遗憾,修改sql查询是没有选择的 编辑 下面是一个示例应用程序: class Program { static voi
5
和50.000.000
之间。对于每个项目,都有1
和5
重复项
我的第一个想法是,将一个项目的每个主键存储在散列集中并进行证明,不管它是否已经存在。如果一个sql语句包含多个主键,我会用下划线或类似的符号来表示它们
但我不确定这是否是最有效的方法。有什么比将每个主键存储在哈希集中更好的方法吗
注意:很遗憾,修改sql查询是没有选择的
编辑
下面是一个示例应用程序:
class Program
{
static void Main(string[] args)
{
int items = 5000000;
int fromDuplicates = 1;
int toDuplicates = 5;
Console.WriteLine("HashSet performance test");
Console.WriteLine("Items: {0}", items);
Console.WriteLine("Amount of duplicates between {0} - {1}", fromDuplicates, toDuplicates);
IList<Guid> guids = new List<Guid>();
Random rnd = new Random((Guid.NewGuid()).GetHashCode());
for (int i = 0; i < items; i++)
{
var guid = Guid.NewGuid();
// Create duplicates
for (int y = 0; y < rnd.Next(fromDuplicates, toDuplicates); y++)
{
guids.Add(guid);
}
}
Console.WriteLine("Begin test. Amount of items: {0}", guids.Count);
System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
watch.Start();
HashSet<string> pkHashSet = new HashSet<string>();
foreach (var g in guids)
{
var str = g.ToString();
// Filter duplicates
if (!pkHashSet.Contains(str))
{
pkHashSet.Add(str);
}
}
watch.Stop();
Console.WriteLine("Elapsed milliseconds: {0}", watch.ElapsedMilliseconds);
Console.WriteLine("Final item amount: " + pkHashSet.Count);
Console.ReadLine();
}
}
类程序
{
静态void Main(字符串[]参数)
{
整数项=5000000;
int fromDuplicates=1;
int-toDuplicates=5;
Console.WriteLine(“哈希集性能测试”);
WriteLine(“Items:{0}”,Items);
WriteLine(“在{0}-{1}之间的重复数量”,从重复到重复);
IList guids=新列表();
Random rnd=new Random((Guid.NewGuid()).GetHashCode());
对于(int i=0;i
有了这个结果。看起来很快:
硬件:i7-5600U(2,6GHz)/8GB Ram Windows 10
您的初始查询是什么样子的。。也许您所需要做的就是创建一个查询,该查询将回调不同的记录。。还有,你为什么不清理这些复制品,或者你保留这些复制品是有原因的吗。。?您是否可以创建自己的存储过程,将数据拉入临时表,然后从临时表中创建一个查询,以剥离或过滤重复项。。你能给我们看些东西,让我们了解你在反对什么吗?我们不能清理数据,而且分组数据更慢。使用distinct
绝对是最慢的版本。在这种情况下,使用HashSet
要快得多。因为我们是在查询外部系统,所以我们不能改变任何事情。不幸的是,客户端筛选是唯一的选择。您能否使用HashSet
显示到目前为止,您在进行筛选之前是如何存储客户端数据的?您是否存储在数据表中
初始值是的,我们使用的是数据表
。我们已经编写了自己的DB游标,用于从数据库检索数据。目前,我只使用HashSet
进行了一些测试。我只是从DataRow['pk']
中添加一个值,然后使用HashSet的Contains
方法。如果Contains
返回false,我会将DataRow
添加到加载的数据列表中。我必须看看你在做什么来可视化代码。。和Contains很好,但不能使用Select函数
和LIKE