常用的几个ForEach扩展,外送一个First方法

现在好像很多人都不太喜欢写For, ForEach, do, while这些循环了,都是用ToList.ForEach之类的。其实我也是这样,但是在.Net里,只有IList<T>有这个方法,很多时候我需要在ICollection<T>, IEnumerable<T>甚至是IEnumerable里使用同样的方式来调用,而且,自带的方法也是简单了些,只有一个遍历功能,不支持中断,没有索引……是不是很不方便呢?

 

很简单,MS不提供,我们就自己动手吧。看代码吧。

 

/// <summary>
 /// 基本上和List<T>的ForEach方法一致。
 /// </summary>
 public static void Each<T>(this IEnumerable<T> col, Action<T> handler)
 {
     foreach (var item in col)
         handler(item);
 }
 /// <summary>
 /// 带索引的遍历方法。
 /// </summary>
 public static void Each<T>(this IEnumerable<T> col, Action<T, int> handler)
 {
     int index = 0;
     foreach (var item in col)
         handler(item, index++);
 }
 /// <summary>
 /// 可以半途中断执行的遍历方法。
 /// </summary>
 public static void Each<T>(this IEnumerable<T> col, Func<T, bool> handler)
 {
     foreach (var item in col)
         if (!handler(item)) break;
 }
 /// <summary>
 /// 可以半途中段的带索引的遍历方法。
 /// </summary>
 public static void Each<T>(this IEnumerable<T> col, Func<T, int, bool> handler)
 {
     int index = 0;
     foreach (var item in col)
         if (!handler(item, index++)) break;
 }
 #region 以下为IEnumerable<T>的非泛型实现
 public static void Each<T>(this IEnumerable col, Action<object> handler)
 {
     foreach (var item in col)
         handler(item);
 }
 public static void Each<T>(this IEnumerable col, Action<object, int> handler)
 {
     int index = 0;
     foreach (var item in col)
         handler(item, index++);
 }
 public static void Each<T>(this IEnumerable col, Func<object, bool> handler)
 {
     foreach (var item in col)
         if (!handler(item)) break;
 }
 public static void Each<T>(this IEnumerable col, Func<object, int, bool> handler)
 {
     int index = 0;
     foreach (var item in col)
         if (!handler(item, index++)) break;
 }
 #endregion

还有一个,Linq里的First很好用,但是对于动态生成的类来说,没有办法在编译之前得到IList<T>,从而都没有办法用First()方法,很不方便测试和调试,我们也扩展一个。

 

 

/// <summary>
/// 给非强类型的IEnumerable返回头一个元素。
/// </summary>
public static object First(this IEnumerable col)
{
    foreach (var item in col)
        return item;
    throw new IndexOutOfRangeException();
}
/// <summary>
/// 给非强类型的IEnumerable返回头一个强类型的元素
/// </summary>
public static object First<T>(this IEnumerable col)
{
    return (T)col.First();
}

 

 

当然这个很简单,因为我们没有事项另一个Expression的重载,不过对于测试吗,也够用了。要实现那个重载,可就不简单了,大家自己想吧!

转载于:https://www.cnblogs.com/anjing/archive/2010/01/12/1644663.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值