Lambda 表达式应用(仿照Linq)

  突然想写一个这样的东西。通过Lambda泛型匿名类型扩展方法等技术写一个类似于Linq的东西挺不错,会对自己这些技术的理解有所提高。

  1.通过扩展方法给IEnumerable<T>类型的数据增加一些方法。

  2.扩展IEnumerable<T>,实现Sum、Max、Min、Avg、Group By、Select、Where等方法。

  3.委托Func<T, TResult>的实现。非常好用,与Lambda表达式配合使用。

static public class Expand
{
public static IEnumerable<TResult> MySelect<T, TResult>(this IEnumerable<T> source, Func<T, TResult> c)
{
foreach (var item in source)
{
var v
= c(item);
yield return v;
}
}

public static IEnumerable<T> MyWhere<T>(this IEnumerable<T> source, Func<T, bool> c)
{
foreach(var item in source)
{
if(c(item))
{
yield return item;
}
}
}

public static IEnumerable<T> MyGroup<T, TResult>(this IEnumerable<T> source, Func<T, TResult> c)
{
List
<TResult> list = new List<TResult>();
foreach (var item in source)
{
var v
= c(item);
if (!list.Contains(v))
{
list.Add(v);
yield return item;
}
}
}

public static decimal? MyMin<T>(this IEnumerable<T> source, Func<T, decimal?> c)
{
decimal? sum = null;
foreach (var item in source)
{
if (sum == null)
sum
= c(item);
else if(sum > c(item))
sum
= c(item);
}

return sum;
}

public static decimal? MyMax<T>(this IEnumerable<T> source, Func<T, decimal?> c)
{
decimal? sum = null;
foreach (var item in source)
{
if (sum == null)
sum
= c(item);
else if (sum < c(item))
sum
= c(item);
}

return sum;
}

public static decimal? MySum<T>(this IEnumerable<T> source, Func<T, decimal?> c)
{
decimal? sum = 0;
foreach (var item in source)
{
sum
+= c(item);
}

return sum;
}

public static decimal? MyAverage<T>(this IEnumerable<T> source, Func<T, decimal?> c)
{
int i = 0;
decimal? sum = 0;
foreach(var item in source)
{
i
++;
sum
+= c(item);
}

return i == 0 ? 0 : sum/i;
}
}

 

使用的时候也非常的简单,跟Linq语法一样,感觉只不过是关键字不一样而已。嘿嘿~~

var sum = list.MySum(p => p.ID);
var min
= list.MyMin(p => p.ID);
var max
= list.MyMax(p => p.ID);
var avg
= list.MyAverage(p => p.Price);
var selectList
= list.MySelect(p => new { p.ID, p.Price });
var list2
= list.MyWhere(p => p.Price == 10);
var groupList
= list.MyGroup(p => new { p.ID, p.Price });
var selectList2
= selectList.MyWhere(p => p.Price > 1).MyGroup(p => p.ID);

 

最后贡献事例代码:下载地址

posted @ 2010-08-12 23:38  13路易的  阅读(542)  评论(0编辑  收藏  举报