List<T>采用delegate快速实现排序、查找等操作

21 篇文章 0 订阅
.NET中的List<T>非常方便,但是很遗憾得是没有自带更方便的一些排序、查找函数。比如说,Sort()和Find()方法都包含在List<T>里,但果你想使用,你得自己写函数。这往往会让我们感到不爽。本文告诉你,其实这些Sort() Find()方法想要的都只是一个一句话delegate而已。 

       声明:本文讨论非LINQ的方法,适用于.NET2.0以上平台
        主要讨论以下三个方法:

    • List<T>.Sort()
    • List<T>.Find()
    • List<T>.Exist()
  1. 我们先看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。

这个委托声明 `public delegate void Obj_GetAtts_WithNoHead(List<matt> atts, byte xiliemark);` 定义了一个名为 `Obj_GetAtts_WithNoHead` 的公共委托,它接受两个参数:一个`List<matt>`类型的变量`atts`,表示一列matt对象列表;另一个参数是`byte`类型的`xiliemark`,可能是某个标识或者标记。 它的用法通常是在需要处理或操作这类数据结构的地方,比如在一个事件处理函数、回调函数或者是作为其他方法的返回值。例如,在一个对象模型中,如果你有一个方法负责获取某个对象的属性集合并且不需要额外的头部信息,你可以这样做: ```csharp public class MyClass { // 假设有一个内部方法GetAttributesWithoutHead() private List<matt> GetAttributesWithoutHead(byte xiliemark) { // 实现获取属性列表的逻辑... } // 将委托注册为事件处理器 public event Obj_GetAtts_WithNoHead OnGetAttributes; // 调用委托传递数据 public void TriggerAttributeEvent(byte xiliemark) { if (OnGetAttributes != null) { OnGetAttributes(GetAttributesWithoutHead(xiliemark), xiliemark); } } } // 使用场景 MyClass myInstance = new MyClass(); myInstance.OnGetAttributes += MyEventHandler; private void MyEventHandler(List<matt> atts, byte xiliemark) { // 在这里处理接收到的atts列表和xiliemark // 可能会更新UI,存储等操作 } ``` 在这里,`TriggerAttributeEvent`方法触发了事件,当有注册的委托处理程序(如`MyEventHandler`)时,就会调用委托并将属性列表和标记一起传递给它们。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值