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);
最后贡献事例代码:下载地址