http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 7165|回复: 8

[其他] 求助一个高效两个数组对比算法

[复制链接]
发表于 2013-2-28 11:21:46 | 显示全部楼层 |阅读模式
两数组数据格式一样的情况
例:
string[] date=File.ReadAllLines("c:\\1.txt", Encoding.Default);
string[] date1=File.ReadAllLines("c:\\2.txt", Encoding.Default);
IEnumerable<string> data2 = data.Except(date1);//相同
IEnumerable<string> data3 = data.Except(date1);//不同
然后再写入一个新的文本...
现在情况是
数据一:
a,b,c,d
q,w,e,r
a,f,f,d
.....
数据二:
a
b
c
......

我现在想对比数据一中的数据和数据二中的第1项对比

我现在的写法是:

string[] date=File.ReadAllLines("c:\\1.txt", Encoding.Default);//数据一
string[] date1=File.ReadAllLines("c:\\2.txt", Encoding.Default);//数据二
for (int i = 0; i < date.Length; i++)
                {
                    string[] temp =date[i].Split(',');
                    for (int j = 0; j < data1.Length;j++ )
                    {
                        if (data1[j].Equals(data[0]))//如果相等
                        {
                            writer.WriteLine("写入一个新的文本");
                            break;
                        }
                    }
                }

但是由于数据量大 这个写法非常的耗时
各位朋友有更好的写法吗?


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2013-2-28 14:09:54 | 显示全部楼层
admin 发表于 2013-2-28 13:14
数组的个数是相同的,下标也是对应的,tmdata[0]=data[0]的,所以直接对应下标就行了

不好意思没怎么明白 也需要再去遍历对比?
发表于 2013-2-28 11:37:57 | 显示全部楼层
如果你使用的是.net2.0的话我看这种方法基本上就够快了
[code=csharp]   string[] data = File.ReadAllLines("c:\\1.txt", Encoding.Default);//数据一
            string[] data1 = File.ReadAllLines("c:\\2.txt", Encoding.Default);//数据二
            for (int i = 0; i < data.Length; i++)
            {
                string temp = data.Split(',')[0];
                for (int j = 0; j < data1.Length; j++)
                {
                    if (data1[j] == temp)//如果相等
                    {
                        //writer.WriteLine("写入一个新的文本");
                        break;
                    }
                }
            }
[/code]
你上面写的好像代码就不对应吧,看看我修改之后的,
如果是4.0的或者是3.5的建议使用Linq进行对比会比较快一些
 楼主| 发表于 2013-2-28 11:40:26 | 显示全部楼层
admin 发表于 2013-2-28 11:37
如果你使用的是.net2.0的话我看这种方法基本上就够快了

你上面写的好像代码就不对应吧,看看我修改之后的 ...

恩几百万数据测试了下需要好几个小时太慢了 那站长linq如何对比?
发表于 2013-2-28 11:42:24 | 显示全部楼层
你百万数据你一下子调过来啊,那会不会是取数据慢了,而且你如果说是百万你一下子调到内存,能受了吗?你的Net版本是那个
 楼主| 发表于 2013-2-28 11:45:47 | 显示全部楼层
本帖最后由 nihaomaxx 于 2013-2-28 11:47 编辑
admin 发表于 2013-2-28 11:42
你百万数据你一下子调过来啊,那会不会是取数据慢了,而且你如果说是百万你一下子调到内存,能受了吗?你的 ...

2个都是百万调换效果差不多 内存占用我看了不多 我4G内存够吃 VS2008 .NET版本3.5
发表于 2013-2-28 11:57:32 | 显示全部楼层
nihaomaxx 发表于 2013-2-28 11:45
2个都是百万调换效果差不多 内存占用我看了不多 我4G内存够吃 VS2008 .NET版本3.5

        [code=csharp]    //先取出data中的每一个,号之前的第一项数据 的集合
            var tmdata = data.Select(x => x.Split(',')[0]).ToList();
            //比较并得到相同的数据集合
            var result = data1.Intersect(tmdata).ToList();
            //result就是相等的新数组数据[/code]
 楼主| 发表于 2013-2-28 12:38:44 | 显示全部楼层
本帖最后由 nihaomaxx 于 2013-2-28 12:40 编辑
admin 发表于 2013-2-28 11:57

我刚测试了下对比成功 但是怎么在吧数据一data全部项在整合呢  这个方法最后只剩第一项的值了!
这个方法我想到过 就是不知怎么在吧全部项整合!
发表于 2013-2-28 13:14:37 | 显示全部楼层
nihaomaxx 发表于 2013-2-28 12:38
我刚测试了下对比成功 但是怎么在吧数据一data全部项在整合呢  这个方法最后只剩第一项的值了!
这个方法 ...

数组的个数是相同的,下标也是对应的,tmdata[0]=data[0]的,所以直接对应下标就行了
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-22 08:04

© 2014-2021

快速回复 返回顶部 返回列表