有资源网yoqq.cn
 
 
查看: 6724|回复: 0

C 基础知识系列- 17 小工具优化

[复制链接]

该用户从未签到

264

主题

264

帖子

119

积分

注册会员

Rank: 2

积分
119
发表于 2020-5-11 02:36:11 | 显示全部楼层 |阅读模式
    0. 媒介

    不知道有没有动手本领强的小同伴照着上一篇的内容写过步伐呢?假如有的话,应该会在利用的时间发现以下几个题目:

    每次启动都必要颠末漫长的时间去遍历磁盘里的文件目次由于数据是用的字典生存的,以是会斲丧大量的内存空间不能多次查询如今我们就针对这些问题,让我们的小工具实用起来。


优化-免费yoqqC 基础知识系列- 17 小工具优化yoqq资源(1)

    1. 分析与实现

    在动手之前,我们先分析一下问题。在现实开辟之前,无论是接到什么需求都要先细致分析一下,确定好方案再动手方为开发的正道。嗯,没弊端。因为开发过程中跟产物对线、跟客户对线要占整个项目标一半左右时间。好了,不废话了。继承:

    遍历文件目录的时间过长,那么我们是不是可以用异步并发去遍历呢?

    数据用字典保存会消耗内存空间,那么我们是不是可以用其他的方式保存呢?

    不能多次查询,是不是可以使用循环,然后设置一个退出条件?

    1.1 C#的异步/并发实现

    在C#里,异步和并发的实现是依据线程、使命来实现的。在之前《C# 底子知识系列- 12 任务和多线程》里大概先容了一下线程和任务,我们知道线程自己是没法返回数据的,它与主线程举行数据交互的过程非常需要留意线程安全。而任务可以返回数据,不需要像线程一样战战兢兢地与主线程进行数据交互。任务有一个长处,它比线程更轻量,所以在当前情况下我们可以试试任务。

    固然,线程也有优点,那就是线程的运行环境相对更封闭一点,它能完成一个长的大型运算。

    那么继续上一篇的内容,先引用 :

    usingSystem.Threading.Tasks;先提取一组根据可罗列目录聚集创建任务组并取得效果的方法:

    public static Dictionary<string,list> OverDirectories(IEnumerable directories)</string,list

    {

    var tasks = directories.Select(dir => Task.Run(()=>OverDirectories(dir))).ToArray();

    Task.WaitAll(tasks);// 这行的意思是等候全部任务完成

    return Concat(tasks.Select(t=>t.Result).ToArray());

    }

    然后改造原有的OverDirectories方法:

    public static Dictionary<string,list> OverDirectories(DirectoryInfo rootDirectory)</string,list

    {

    Console.WriteLine($"正在遍历目录:{rootDirectory.FullName}");

    var dict = new Dictionary<string, list>();

    IEnumerable files = new List();

    try

    {

    files = rootDirectory.EnumerateFiles();

    }

    catch(Exception e)

    {

    Console.WriteLine($"错误信息:{e}");//打印错误信息

    }

    foreach(var file in files)

    {

    var key = Path.GetFileNameWithoutExtension(file.Name);

    if(!dict.ContainsKey(key))

    {

    dict[key] = new List();

    }

    dict[key].Add(file.FullName);

    }

    try

    {

    var dirs = rootDirectory.EnumerateDirectories();

    return Concat(dict, OverDirectories(dirs));// 接纳线程版的方法进行遍历

    }

    catch (System.Exception e)

    {

    Console.WriteLine($"错误信息:{e}");//打印错误信息

    }

    return dict;

    }

    1.2 数据复用

    抱负状态下,我们的数据应该是保存在数据库的,但因为数据库的操纵是在下一系列的教程中,所以现在只能舍弃这个假想。

    那么,使用现有方式,我们可以使用文件作为缓存的方式,也就是说把数据保存在文件里,在需要的时候从文件中读取出来。这时候就需要一组操作文件的方法。

    起首,声明一个静态变量:

    public static readonly string TempFile = "temp.txt";

    然后编写读取、存放数据的方法:

    public static void WriteLinesToTemp(List lines)

    {

    File.AppendAllLines(TempFile, lines);

    }

    public static List Search(string file)

    {

    var lines = File.ReadLines(file);

    var results = lines.Where(line=>Path.GetFileNameWithoutExtension(line).Contains(file));

    return results.ToList();

    }

    这时候在文件中存放的都是路径文件,所以需要重新修改遍历文件路径的方法,只保存路径:


优化-免费yoqqC 基础知识系列- 17 小工具优化yoqq资源(2)

    末了修改主方法,设置启动时遍历路径的规则:


优化-免费yoqqC 基础知识系列- 17 小工具优化yoqq资源(3)

    1.3 循环使用并设置退出条件

    设置用户输入q或Q的时候退出程序,这时候就需要改造Main方法了:


优化-免费yoqqC 基础知识系列- 17 小工具优化yoqq资源(4)

    在main 方法里加了许多提示语句,以方便使用。

    2. 总结

    以上是第一次实战课的所有内容。接待各位小伙伴们踊跃讨论。这个小工具并不美满,但是随着我们对.net core的相识和深入就会写的得心应手了。最后吐槽一句百度的编译器,代码渲染挺差的。


有资源网- 版权声明 1、本主题所有言论和图片纯属会员个人意见,与有资源网立场无关。
2、本站所有主题由该帖子作者发表,该帖子作者有资源网享有帖子相关版权。
3、有资源网管理员和版主有权不事先通知发贴者而删除本文。
4、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者 有资源网的同意。
有资源网是一个网络技术交流、游戏交流、娱乐休闲的温馨家园.提供网络最新it资讯、热门电影电视剧、破解软件工具下载_技术和娱乐性的综合型大论坛论资源网
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

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