linq中提供了很多集合的扩展方法,配合lambda能简化数据处理;
举例:
先引用using System.Linq;不然无法使用where;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Linqex
{
class Program
{
static void Main(string[] args)
{
int[] nums = new int[] {3,5,353,6235,21,7 };
//where方法会遍历集合中每个元素,对于每个元素
//都调用a=>a>30这个表达式判断一下是否为true
//如果为true,则把这个放到返回的集合中
//这里的where是扩展方法,不是数组的方法
IEnumerable<int> result = nums.Where(x => x > 30);
foreach (var item in result)
{
Console.WriteLine(item);
}
}
}
}
//结果
//353
//6235
//找出了大于30的集合
根据上面的linq语法,自己实现上面的功能:
using System;
using System.Collections.Generic;
using System.Linq;
namespace Linqex
{
class Program
{
static void Main(string[] args)
{
int[] nums = new int[] {3,5,353,6235,21,7 };
//IEnumerable<int> result = nums.Where(x => x > 30);
IEnumerable<int> result = myWhere1(nums, a => a > 30);
foreach (var item in result)
{
Console.WriteLine(item);
}
}
//遍历IEnumerable的items,调用f的委托,判断为true,则返回到结果的集合中
static IEnumerable<int> myWhere1(IEnumerable<int> items,Func<int,bool> f)
{
List<int> result = new List<int>();
foreach (var item in items)
{
if (f(item) == true)
{
result.Add(item);
}
}
return result;
}
}
}
//结果与用linq语法相同
用yield来实现返回
static IEnumerable<int> myWhere2(IEnumerable<int> items, Func<int, bool> f)
{
foreach (var item in items)
{
if (f(item) == true)
{
yield return item;
}
}
}
//结果一样
//用yield一边获取数据,一边处理数据,效率更高
可以使用var让编译器的“类型推断”来简化类型的声明。在LINQ中常用。
C#的var会根据变量的赋值推断出类型,在编译后会变为实际的类型。
C#的var和JavaScript的var不一样,仍然是强类型的。
C#中的弱类型是dynamic。