分享一个简单的资源管理器程序,主要是演示下LINQ在C#开发中的运用
以前有人在论坛里面问过,如何实现一个类似资源管理器的界面,其实运用 System.IO 下的一组API,很容易查询文件系统的文件。虽然说容易,但是还是很多人希望能看到具体的代码。下面我对其中最关键的代码作一个演示,程序尽可能简单,以便大家关注于主要问题。
先看下效果图:

代码下载 http://download.csdn.net/detail/caozhy/4169965。
本程序中使用了LINQ语法,简洁性大家可以自己体会,由于LINQ的运用,程序甚至连一个循环语句都不需要。很多人有一种误解,说到LINQ,就是数据库访问,就是ORM框架,就是转化成SQL执行等等,其实这是对LINQ的误解,我想用这个例子程序说明,LINQ没有那么神秘,它就是C# 3时代的一种简单语法,它可以融入到程序的每个角落。大家可以放心大胆地使用LINQ简化开发,书写紧凑的代码。
说一下这个程序的主要意图:
首先看到的是Form_Load,它的作用是加载根节点和驱动器列表:
你没有看错,一行就写完了。
如果不用LINQ,我们可以怎么写呢?
这段代码的作用和上面的LINQ写法作用是等效的。可是明显写的更复杂了。
使用LINQ写法,用到了Select操作符,这个操作才我们的程序中还会反复出现,所以简单介绍下。
很多人用过SQL,知道用select可以从表中选定某几列,在数学上,这个操作叫投影,通俗地说,就是对集合中的每一个元素做这样一种变换(什么变换由select子句决定),让每个元素成为另一种类型的元素,得到一个新的集合。
从数据中选择几列只是select操作的特例,在LINQ中,Select操作可以方便地将某个类型转换成另一个类型,在这里我们把查询出来的DriveInfo类型对象转换为Nodes.Add()方法理解的TreeNode类型。为此我们使用了一个Lambda表达式:
它相当于你写了这么一个函数:
这个函数由谁调用呢?由LINQ调用,而不是你,虽然它是你定义的。
你将函数作为参数传给LINQ,LINQ通过反过来调用你的函数实现这种转换,再提供给你转换后的集合。
之后看到的是treeView1_BeforeExpand事件,它的作用是在展开节点的时候加载下面每个子节点再下一层的节点,为什么要子节点再下一层呢?这样可以让那些包含再下一层元素的节点提前出现“+”号,在展开的时候可以看到。这种按需加载TreeNode的技术很常用,希望新手们熟练掌握。
然后我们看到的是另一个事件处理函数treeView1_AfterSelect,它的作用是在点了某个节点的时候在ListView里面加载这个文件夹下的文件夹和文件。按照Windows习惯,先显示文件夹再显示文件。而且分别对文件夹和文件排序。请问这个如何实现?
如果用LINQ同样简单,只需要使用OrderBy操作就可以了。
先看下效果图:

代码下载 http://download.csdn.net/detail/caozhy/4169965。
本程序中使用了LINQ语法,简洁性大家可以自己体会,由于LINQ的运用,程序甚至连一个循环语句都不需要。很多人有一种误解,说到LINQ,就是数据库访问,就是ORM框架,就是转化成SQL执行等等,其实这是对LINQ的误解,我想用这个例子程序说明,LINQ没有那么神秘,它就是C# 3时代的一种简单语法,它可以融入到程序的每个角落。大家可以放心大胆地使用LINQ简化开发,书写紧凑的代码。
说一下这个程序的主要意图:
首先看到的是Form_Load,它的作用是加载根节点和驱动器列表:
treeView1.Nodes.Add(new TreeNode("Computer", DriveInfo.GetDrives()
.Select(x => new TreeNode(x.Name) { Tag = x }).ToArray()) { Tag = "root" });你没有看错,一行就写完了。
如果不用LINQ,我们可以怎么写呢?
var rootNode = new TreeNode("Computer") { Tag = "root" };
treeView1.Nodes.Add(rootNode);
foreach (var item in DriveInfo.GetDrives())
{
rootNode.Nodes.Add(new TreeNode(item.Name) { Tag = item });
}这段代码的作用和上面的LINQ写法作用是等效的。可是明显写的更复杂了。
使用LINQ写法,用到了Select操作符,这个操作才我们的程序中还会反复出现,所以简单介绍下。
很多人用过SQL,知道用select可以从表中选定某几列,在数学上,这个操作叫投影,通俗地说,就是对集合中的每一个元素做这样一种变换(什么变换由select子句决定),让每个元素成为另一种类型的元素,得到一个新的集合。
从数据中选择几列只是select操作的特例,在LINQ中,Select操作可以方便地将某个类型转换成另一个类型,在这里我们把查询出来的DriveInfo类型对象转换为Nodes.Add()方法理解的TreeNode类型。为此我们使用了一个Lambda表达式:
x => new TreeNode(x.Name) { Tag = x }它相当于你写了这么一个函数:
TreeNode ConvertDriveInfoToTreeNode(DriveInfo x)
{
TreeNode tn = new TreeNode(x.Name);
tn.Tag = x;
return tn;
}这个函数由谁调用呢?由LINQ调用,而不是你,虽然它是你定义的。
你将函数作为参数传给LINQ,LINQ通过反过来调用你的函数实现这种转换,再提供给你转换后的集合。
之后看到的是treeView1_BeforeExpand事件,它的作用是在展开节点的时候加载下面每个子节点再下一层的节点,为什么要子节点再下一层呢?这样可以让那些包含再下一层元素的节点提前出现“+”号,在展开的时候可以看到。这种按需加载TreeNode的技术很常用,希望新手们熟练掌握。
然后我们看到的是另一个事件处理函数treeView1_AfterSelect,它的作用是在点了某个节点的时候在ListView里面加载这个文件夹下的文件夹和文件。按照Windows习惯,先显示文件夹再显示文件。而且分别对文件夹和文件排序。请问这个如何实现?
如果用LINQ同样简单,只需要使用OrderBy操作就可以了。
...全文
相关推荐
C#简单资源管理器
标题 "C#简单资源管理器" 提供了一个关键信息,那就是这个项目是使用C#编程语言构建的一个简易版的资源管理器。
CSDN技术专家分享:C#编程技巧详解
本文还有配套的精品资源,点击获取 简介:《CSDN技巧集》是一本针对C#语言的深度技术指南,由CSDN社区出版。它汇集了众多技术专家的实战经验和技巧,全面覆盖了C#的基础语法和高级特性。读者将通过学习变量、数据类型、控制流、函数、类和对象等核心概念,以及泛型、委托、事件、Linq和异步编程等内容,提升编程技能。书中还深入探讨面向对象编程、设计模式、.NET框架架构和数据库操...
C#做的Windows资源管理器
这个项目在codefans.net上分享,为开发者提供了一个学习和参考的平台,特别是对于那些想要在C#环境中构建文件管理界面的程序员。
run-webserver-here:超级简单的Windows资源管理器外壳程序扩展,可立即启动Web服务器以获取目录中的静态内容
**C#编程**:作为主要开发语言,C#提供了丰富的类库和特性,如.NET Framework或.NET Core,用于构建桌面应用程序。
完整的资源管理器,附源代码。
在编程领域,特别是C#这样的高级编程语言中,开发者经常需要创建自定义的资源管理器来满足特定的需求。本文将深入探讨如何使用C#语言构建一个完整的资源管理器,并分享一个具有源代码的实例。


