• 集合里查找数据


    比如 List<string> a=new List<string>();
    a里面有{111,222,333,444,555,666,777,888,999,111,222,333,444}
    找出交集得到结果是
    111,222,333,444

    速度要快的,数据量是在百万条之上。什么算法最快? ------Solutions------ 找出 出现次数 2次以上的 ? ------Solutions------ 对,速度要快的 ------Solutions------List<string> list = a.Where(s => a.Count(s2 => s == s2) >= 2).Distinct().ToList();

    List<string> list = a.AsParallel().Where(s => a.Count(s2 => s == s2) >= 2).Distinct().ToList();

    linq就是妙。学习!
    ------Solutions------
    速度还是慢,我本来查询50000条数据要花50秒
    现在感觉更慢了!
    ------Solutions------
    用字典试试:

    Dictionary<string,int> dic = new Dictionary<string,int>();
    foreach(string s in a)
    {
        if(dic.ContainsKey(s))
            dic[s]++;
        else 
            dic.Add(s,1);
    }
    List<string> list = new List<string>();
    foreach(string s in dic)
    {
        if(dic[s]>1)
           list.Add(s);
    }

    var list1 = Enumerable.Range(10, 50);  // 10 -  59
                var list2 = Enumerable.Range(20, 20);  // 20 -  39
                var list3 = Enumerable.Range(40, 30);  // 40 -  69
                List<int> list = list1.Concat(list2).Concat(list3).ToList();
    
                System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
                stopwatch.Start();
                for (int i = 1; i <= 100; i++)
                {
                    //GetLINQFunctionTestTime();
                    var query = list.GroupBy(m => m).Where(p => p.Count() > 1).Select(p => p.Key).ToList();
                    //List<string> list_a = list.AsParallel().Where(p => list.Count(m => p == m) >= 2).Distinct().ToList();
                }
                stopwatch.Stop();
                Console.WriteLine("使用 LINQ 总共用时 {0} 毫秒,平均 {1}毫秒/次", stopwatch.ElapsedTicks, stopwatch.ElapsedTicks / 100);
    
    
                stopwatch.Start();
                for (int i = 1; i <= 100; i++)
                {
                    //GetOtherFunctionTestTime();
                    ArrayList arrList = new ArrayList();
                    List<int> result = new List<int>();
                    foreach (int item in list)
                    {
                        if (arrList.Contains(item))
                        {
                            result.Add(item);
                        }
                        else
                        {
                            arrList.Add(item);
                        }
                    }
                }
                stopwatch.Stop();
                Console.WriteLine("使用 Other 总共用时 {0} 毫秒,平均 {1}毫秒/次", stopwatch.ElapsedTicks, stopwatch.ElapsedTicks / 100);
    
    
                stopwatch.Start();
                for (int i = 1; i <= 100; i++)
                {
                    //GetDictionaryFunctionTestTime();
                    Dictionary<int, int> dic = new Dictionary<int, int>();
                    foreach (var item in list)
                    {
                        if (dic.ContainsKey(item))
                        {
                            dic[item]++;    //存在dic的值就加1
                        }
                        else
                        {
                            dic.Add(item, 1);   //初始值为1
                        }
                    }
                    List<int> result = new List<int>();
                    foreach (var item in dic)
                    {
                        if (dic[item.Key]>1)
                        {
                            result.Add(item.Key);
                        }
                    }
    
                }
                stopwatch.Stop();
                Console.WriteLine("使用 Dictionary 总共用时 {0} 毫秒,平均 {1}毫秒/次", stopwatch.ElapsedTicks, stopwatch.ElapsedTicks / 100);
    
                /*
                使用 LINQ 总共用时 7344 毫秒,平均 73毫秒/次
                使用 Other 总共用时 15501 毫秒,平均 155毫秒/次
                使用 Dictionary 总共用时 22191 毫秒,平均 221毫秒/次
    
                */
    View Code
    //写了一个DEMO 测试了一下不同的方法所有的时间
    //DEMO中的LIST中有100条数据  每个方法重复执行100次
    void Main()
    {
    InitList();
     
    System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
    stopwatch.Start();
    for(int i=1;i<=100;i++)
    {
      GetLINQFunctionTestTime();
    }
    stopwatch.Stop();
    Console.WriteLine("使用 LINQ 总共用时 {0} 毫秒,平均 {1}毫秒/次",stopwatch.ElapsedTicks,stopwatch.ElapsedTicks/100);
    
    
    stopwatch.Start();
    for(int i=1;i<=100;i++)
    {
      GetOtherFunctionTestTime();
    }
    stopwatch.Stop();
    Console.WriteLine("使用 Other 总共用时 {0} 毫秒,平均 {1}毫秒/次",stopwatch.ElapsedTicks,stopwatch.ElapsedTicks/100);
    
    
    stopwatch.Start();
    for(int i=1;i<=100;i++)
    {
      GetDictionaryFunctionTestTime();
    }
    stopwatch.Stop();
    Console.WriteLine("使用 Dictionary 总共用时 {0} 毫秒,平均 {1}毫秒/次",stopwatch.ElapsedTicks,stopwatch.ElapsedTicks/100);
    
    /*
    使用 LINQ 总共用时 7344 毫秒,平均 73毫秒/次
    使用 Other 总共用时 15501 毫秒,平均 155毫秒/次
    使用 Dictionary 总共用时 22191 毫秒,平均 221毫秒/次
    
    */
    }
    
    void  GetLINQFunctionTestTime()
    { 
      var query=list.GroupBy(l=>l).Where(g=>g.Count()>1).Select(g=>g.Key).ToList();
    }
    
    void GetOtherFunctionTestTime()
    {
      ArrayList ay=new ArrayList();
      List<int> result=new List<int>();
      foreach(int str in list)
      {
    if(ay.Contains(str))
    {
      result.Add(str);
    }
    else
    { 
      ay.Add(str);
    }
      }
    }
    
    void GetDictionaryFunctionTestTime()
    {  
        Dictionary<int,int> dic = new Dictionary<int,int>();
    foreach(int s in list)
    {
    if(dic.ContainsKey(s))
    dic[s]++;
    else 
    dic.Add(s,1);
    }
    List<int> result = new List<int>();
    foreach(var s in dic)
    {
    if(dic[s.Key]>1)
    result.Add(s.Key);
    }
    
    }
    public List<int> list = new List<int>();
    void InitList()
    {
      var list1=Enumerable.Range(10,50);  // 10 -  59
      var list2=Enumerable.Range(20,20);  // 20 -  39
      var list3=Enumerable.Range(40,30);  // 40 -  69
      list=list1.Concat(list2).Concat(list3).ToList();
    }
    View Code
  • 相关阅读:
    删除数据库的数据后让id从1开始算
    通过数据库绑定的dropdownlist,如何让其第一条默认显示"--请选择--"
    winform 验证用户正确后打开新窗口时关闭登陆窗口
    winform FormBordStyle=none 及 wpf FormBordStyle=none 的鼠标点击移动问题
    [AngularJS] AngularJS系列(3) 中级篇之表单验证
    linux开启mysql远程登录
    linux下JDK,tomcat的安装与环境变量配置
    linux下mysql连接jar包的位置在哪里?
    linux下mysql忘记root密码的解决方案
    RedHat下MySQL 5.6 安装、维护
  • 原文地址:https://www.cnblogs.com/love201314/p/4955664.html
Copyright © 2020-2023  润新知