Linq作为 .net3.5 可以比肩蓝翔挖掘机的重磅产品,当然可以对万事万物进行查询。而不只是查查xml,数据库可以概括的。自然,我们也能用它对List<T> ,甚至简单的数组进行查找。 简单说来,只要是实现了IEnumerable<T>接口的数据结构,我们都能对其使用linq进行查找,而lambda表达式,则是代码简洁易编写的保证。 举例说明。 有类:People。包含两个字段,ID和姓名。ID为一位大写字母加三位数字组成,比如A010。A>B,9>1。即公司最高职位是A999,最低职位是Z001。
public class People
{
public People(string ID, string strName)
{
this.ID = ID;
this.strName = strName;
}
public string ID;
public string strName;
}
创建一个List,并添加一些测试数据
List<People> listPeople = new List<People>() { new People("Z110", "yzh"),
new People("A050", "zhh"),
new People("B135", "dhh"),
new People("C321", "dbb"),
new People("A111", "dnn"),
new People("Z111", "myOK")};
例1:查找ID包含A的员工。
var selectItems = listPeople.Where(o => o.ID.Contains('A'));
//打印返回的list。
selectItems.ToList<People>().ForEach(o => Console.WriteLine(o.ID + " " + o.strName));
.where方法返回的是一个枚举,我们可以使用ToList方法把它转换成相应的数组。 例2:对上面的结果进行公司职位高低排序。
var selectSortItems = selectItems.OrderBy(o => o.ID, mc); //如果是简单的升降排序,我们只需要传入选择器,用默认的系统排序器即可。
这里有些复杂,网上的材料不多。OrderBy函数,传入的是两个参数,一个选择器,一个排序器。选择器我们自然可以使用lambda表达式选择People类中的字段ID。但是,排序器MC我们该如何实现呢? 排序器是一个类的实例,它实现接口IComparer<T>
class MyComparer : IComparer<string>
{
/// <summary>
/// 比较函数具体实现,对x和y的绝对值进行比较。
/// </summary>
public int Compare(string x, string y)
{
if (!x.Substring(0, 1).Equals(y.Substring(0, 1)))//首先对首字母进行比较。
{
return x.CompareTo(y);
}
else
{
return x.CompareTo(y) * (-1);//若首字母相同,比较数字部分。降序,所以乘以-1
}
}
}
自然 MyComparer mc = new MyComparer(); 利用linq中的orderby,我们可以对任意数据以任意方法进行排序和查找。感觉是很不错的。而且大部分情况下我们不需要自己实现排序器。只用简单的一个lambda式就能完成排序,真呀么真开心。 例子3,对数据进行分页。 这个例子我们必须动用linq中的Skip函数和Take函数。Skip(N)函数会跳过前面N个对象,而Take(N)则会从当前位置选取N个连续的对象。并返回新的枚举。 下面的代码就是将测试数据分成3页。
int pageSize = 3;
int pageCount = listPeople.Count % pageSize == 0 ? listPeople.Count / pageSize : listPeople.Count / pageSize + 1;
for (int i = 1; i <= pageCount; i++)
{
var sortList = listPeople.OrderBy(o => o.ID).Skip(pageSize * (i - 1)).Take(3);
foreach (People p in sortList)
{
Console.WriteLine(p.strName);
}
Console.WriteLine("===========================");
}
例4:查找其他类型 下面这个例子,返回数组中长度大于4的单词的枚举。数组也是一样的可以查的。嘿嘿。
string[] testArray = { "hello", "world", "my", "baby" };
var selectItems = from item in testArray
where item.Length > 4
select item;
等价于:var selectItems = testArray.Where(o => o.Length > 4); 终于弄完了。哈哈。linq真是个好东西啊。