LINQ to Object

LinQ to Object是指对任意IEnumerableIenumerable<T>集合使用linq查询.它可代替查询任何可枚举的集合.List<T>,ArrayDictionary<K,V>. 


LINQ的优点


  和foreache相比有三个优点

  • 它们更简明、更易读,尤其在筛选多个条件时。
  • 它们使用最少的应用程序代码提供强大的筛选、排序和分组功能。
  • 无需修改或只需做很小的修改即可将它们移植到其他数据源。


LINQ特性



对象初始化器,这个其实我们一直在用.就如我们添加很多的sql参数

SqlParameter[]parameters = {
newSqlParameter("@QuestionID",Convert.ToInt32 (map["QuestionID"])),
newSqlParameter("@ChapterID",map["ChapterID"].ToString () ),
newSqlParameter("@QuestionTypeID",map["QuestionTypeID"].ToString() ),
newSqlParameter("@Remark", map["Remark"].ToString () )};

以上是我们常用的一种数组初始化器

下面是集合初始化器.

IList<Book> books = new List<Book> { 
     new Book { Title = "Inside COM", ISBN = "123-456-789",Price=20 },
     new Book { Title = "Inside C#", ISBN = "123-356-d89",Price=100 },
     new Book { Title = "Linq", ISBN = "123-d56-d89", Price = 120 }
};

上节说道LINQ的查询方式有两种,表达式和操作符,Object的操作也是这两种方式;是要明白并不是所有的查询和操作符号都具有延时性.我们就开始吧


标准查询whereselect


实例数组的查询

Select[]greetings={
"hello","hello LINQ","How are you"
} 
Var items= from group in greetings where group.lenght>10 select group
//where,select关键字是linq to object编程接口标准查询符。grou是查询变量

对集合的查询

//定义一个序列,使用泛型接口时类型T要明确指定具体类型

String[]strArrary={"one","two","three","four","five","six","seven","eight","nine","ten"}
 
//使用标准查询操作符号where,
 
IEnumerable<String> strSquence=strArrary.Where(p=>p.StartWith("t"));
 
//便利输出满足条件的元素
 
Foreach(stringitem in items)
Consel.writeline(item);
Console.Read();


where操作符号返回一个泛型对象。也就是一个序列对象。该对象是在foreach序列化时调用where操作符执行的。这种查询是延迟查询。

 

例如可以指定一个查询,多次理解查询结果,当被查询的数据在多次力矩之间发生变化,多次查询结果是不同的。每次都是最新的数据

 static void Main(string[] args)
        {
            int[] intArray = new int[] { 9, 8,7 };
            //下面的查询表达式等价于代码 IEnumerable<int> ints = intArray.Select(i => i);
            var ints = from i in intArray
                       select i;
 
            //第一次列举
            foreach (int i in ints)
                Console.WriteLine(i);
 
            //修改元素的值
            intArray[0] = 999;
            intArray[1] = 888;
            intArray[2] = 777;
           Console.WriteLine("---------");
            //第二次列举
            foreach (int i in ints)
                Console.WriteLine(i);
            Console.Read();
        }
 



非延时

如果不想延迟查询,拿上执行,可以再上面的调用方法上转换,ToArrayToLIst等方法

int[] intArray = newint[] { 9, 8, 7 };
            //使用ToArray方法进行转换
            IEnumerable<int> ints =intArray.Select(i => i).ToArray();
 
            foreach (int i in ints)    //第一次列举
                Console.WriteLine(i);
            intArray[0] = 999;   //修改元素的值
            intArray[1] = 888;
            intArray[2] = 777;
           Console.WriteLine("---------");
 
            foreach (int i in ints)  //第二次列举
                Console.WriteLine(i);



为何是相同的,原因在于查询表达式时调用了ToArray方法,立即执行,并将查询结果保存在整数类型数组ints中。两次列举数组中的元素,输出结果相同,修改的只是IntArray数组中的值,并没有影响ints数组值。很好的一个应用吧


总结


以上述的只是object的冰上一角。更多的object的操作方法是在对web页面数据绑定以及form窗体的数据绑定以及综合查询和排序等,以及funt<T,TResult>的应用。下篇介绍泛型委托FuncT<>的应用。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 27
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值