List<T>采用delegate快速实现排序、查找等操作
来源:互联网 发布:手机比价软件 编辑:程序博客网 时间:2024/05/17 06:52
.NET中的List<T>非常方便,但是很遗憾得是没有自带更方便的一些排序、查找函数。比如说,Sort()和Find()方法都包含在List<T>里,但果你想使用,你得自己写函数。这往往会让我们感到不爽。本文告诉你,其实这些Sort() Find()方法想要的都只是一个一句话delegate而已。
声明:本文讨论非LINQ的方法,适用于.NET2.0以上平台
主要讨论以下三个方法:
- List<T>.Sort()
- List<T>.Find()
- List<T>.Exist()
- 我们先看List<T>.Sort()。其定义是:public void Sort( Comparison<T> comparison )
其要求传入的参数是Comparison<T> comparison。那我们看看Comparison<T> comparison 要求我们传入哪些参数、返回什么样的值。
查阅MSDN后,我们发现Comparison<T> 要求我们传入两个T的示例,即t1和t2;返回结果是整数,如果t1<t2返回-1,如果相等返回-,如果t1>t2返回1,和字符串比较的返回方式一样。
于是我们可以这样设计delegate:
listVideoItems.Sort(delegate(VideoItem v1, VideoItem v2) { return Comparer<string>.Default.Compare(v1.Title, v2.Title); });
上面的代码是对实体的Title属性进行排序,采用字符串比较的返回值作为delegate的返回值,呵呵,很简单很巧妙吧? o(∩_∩)o
2. 接下来我们看看List<T>.Find()和List<T>.Exist()
Find()的定义如下:
public T Find( Predicate<T> match )
Exist也类似:
public bool Exists( Predicate<T> match )
看出来了吧?呵呵,只要我们设计好Predicate<T> match 这个参数的delegate,Find()和Exists()这两个函数我们都可以用了。
查询MSDN发现,Predicate<T> 要求我们传入一个T的实体,并返回这个T是不是存在的布尔结果。
非常简单得我们就可以写出:
VideoItem video= listVideoItems.Find(delegate(VideoItem v) { return v.Title== "xxxxx"; })
以上代码表示按照标题查找实体,当然"xxxxx"你可以替换成别的,变量和硬代码都可。v.Title == "xxxxx" 这种方式也可以改为 v.Minutes > 25 或其他,只要能返回布尔结果即可。
同样的delegate也可以用在Exists()中:
bool flag= listVideoItems.Exists(delegate(VideoItem v) { return v.Minutes > 25 ;})
最后,List<T>当中还有一个非常好用的FindAll()方法,也相当好用,相信看完本文的朋友马上就能写出delegate来。o(∩_∩)o。
<pre name="code" class="csharp">定义一个类型 public class tt { public int id; public string name; public string sex; } 测试 List<tt> list = new List<tt>(); for (int i = 5; i > 0; i--) { tt t = new tt(); t.id = i; t.name = "name" + i; t.sex = "sex" + i; list.Add(t); } StringBuilder sb = new StringBuilder(); foreach (tt t in list) { sb.AppendLine("{id=" + t.id + ",name=" + t.name + ",sex=" + t.sex + "}"); } MessageBox.Show("排序前\n" + sb.ToString()); list.Sort(delegate(tt small, tt big) { return small.id - big.id; }); sb = new StringBuilder(); foreach (tt t in list) { sb.AppendLine("{id=" + t.id + ",name=" + t.name + ",sex=" + t.sex + "}"); } MessageBox.Show("排序后\n" + sb.ToString());</pre><br> <br> <pre></pre>
- List<T>采用delegate快速实现排序、查找等操作
- List<T>采用delegate快速实现排序、查找等操作
- List<T>采用delegate快速实现排序、查找等操作
- List 采用delegate快速实现排序、查找等操作
- List采用delegate快速实现排序、查找等操作
- .NET泛型List实现快速排序、查找功能
- java8 快速实现List转map 、分组、过滤等操作
- C# List<T> 数组,集合等排序
- Dictionary的排序查找等一些操作
- 采用部分快速排序算法实现数组的部分排序
- List<T>模糊查找、排序(非Linq)
- List<T> 查找、删除
- QML ListView实现过滤、排序、查找等
- C++链表的创建、插入、删除、查找、合并、排序、修改等操作的实现
- 快速排序以及二分查找的实现
- List<T>在搜索和排序时采用不同方法的性能比较
- C# List<T>排序
- List<T>排序
- ubuntu安装极点五笔输入法
- 强连通分量+二分匹配
- PCB开V槽与打邮票孔
- False coin - POJ 1029
- cookie
- List<T>采用delegate快速实现排序、查找等操作
- chromium for android 硬件渲染流程总结
- 功能强大的命令dd
- 编程获取系统当前cpu使用率/空闲率 、内存使用率、剩余可用内存 Nvidia GPU的利用率等
- 用Dezender解密zend加密后的php代码
- 笑话:历史上第一桩外包业务
- STM32的栈增长和大端/小端问题是和CPU相关的两个问题
- Java利用httpasyncclient进行异步HTTP请求
- Android设置应用程序默认语言