筛选项使用C#HashSet复制客户端

筛选项使用C#HashSet复制客户端,c#,client,hashset,C#,Client,Hashset,目前我遇到的问题是,我需要过滤客户端上SQL查询的结果。可返回的数据量介于5和50.000.000之间。对于每个项目,都有1和5重复项 我的第一个想法是,将一个项目的每个主键存储在散列集中并进行证明,不管它是否已经存在。如果一个sql语句包含多个主键,我会用下划线或类似的符号来表示它们 但我不确定这是否是最有效的方法。有什么比将每个主键存储在哈希集中更好的方法吗 注意:很遗憾,修改sql查询是没有选择的 编辑 下面是一个示例应用程序: class Program { static voi

目前我遇到的问题是,我需要过滤客户端上SQL查询的结果。可返回的数据量介于
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