常用的C#LINQ理解和运用

来源:互联网 发布:梯度下降算法 matlab 编辑:程序博客网 时间:2024/06/17 13:12
自从大二学习了C#这门编程语言,到目前为止,要说自己对哪个地方最为深刻与赞叹,我觉得当然要数:①C#组件技术(.NET基本组件、.NET组件、用户定制控件);②语言集成查询LINQ。前者让我们的编程变得简单——不管是站在巨人的肩膀上还是站在自己的肩膀上!后者让我们对于对于集合对象有了很优质的操作,由其对于我们这种工科的学生编程来说。这次,出于学习总结的角度,写下一些关于LINQ的学习笔记,也许也能让一些新学习的朋友借鉴一下。

(1)从匿名方法说起:
匿名方法即是“没有名称”的方法,它是出于为委托或者事件提供简化绑定方法的目的的。因此,在方法本身代码较少易于管理的情况下,使用匿名方法就不必去定义事件订阅者类了。

class EventSender{   delegate void SomeDelegate(string mgs);   static void Main()   {     SomeDelegate obj=delegate(string mgs)                              {                                 Console.WriteLine("mgs");                              }      obj("委托调用匿名方法");    }  }

(2)lanmuda表达式:
lanmuda表达式是对匿名方法的简化,任何匿名方法使用的场合lanmuda表达式都可以替代,并且代码更加简洁。lanmuda表达式会广泛用于LINQ中。lanmuda表达式的形式如下;
①无参的:()=>{处理语句};
②一个参数的:参数=>{处理语句};
③多个参数的:(参数1,参数2,…参数n)=>{处理语句}。
备注:一条处理语句,{}可以省略!

匿名方法:SomeDelegate obj=delegate(string mgs)                              {                                 Console.WriterLine("mgs");                              }对应的lanmuda表达式:SomeDelegate obj=mgs=>Console.WriterLine("mgs");

(3)LINQ查询语法:
①方法语法:扩展方法+lanmuda表达式;
②声明式的查询语法类似于SQL查询方式。
PS:什么是扩展方法?扩展方法就是向现有的类型添加一些方法,使得该类型在功能上有所扩展!扩展方法可以简化以继承实现的方法扩展,并且在不知道原有基类的内部构造时,将十分有利。
a.方法语法(传输链):

IEnumerabl<T>query=源集合.Where(过滤,必须bool表达式).OrderBy(排序条件).Select(选择条件)

b.查询表达式:

var 结果集=from n in 数据源           where 过滤表达式           orderby 排序           select 投影(选择)查询表达式需以select或者group结束!

(4)目前自己常用的一些方法总结:
①返回list<>或者数组元素个数,以便循环:.Count/.Count();

 for (int j = 0; j < TextData.Count; j++) {    if (TextData[j].Trim().ToCharArray().Count() > 3)      {         directs++;      }    else break; }

②返回序列中满足某些条件的元素个数:

int Stations = TextData.Count(s => s[0] == 'D');(TextData是一个string类的顺序表,返回TextData中以D开头的元素个数)

③返回序列:最大值、最小值、和、平均数、指定运算等

 static void Main(string[] args)        {            int[] nums = new int[] { 1, 2, 3, 4, 5 };            int sum = nums.Sum();            int max = nums.Max();            int min = nums.Min();            double average = nums.Average();            //Aggregate()实质为累加器函数            int num1 = nums.Aggregate((s, t) => s + t);            Console.WriteLine(num1);            Console.ReadKey();        }

④返回序列的中满足某条件的第一个元素本身,或者元素的索引:

a.满足条件第一个元素本身:  序列.First(指定条件,如s=>s.StartsWith("e"))b.满足条件第一个元素的索引(位置):var query = (from n in TextData select n).TakeWhile(s => s[0] != 'D');int firstStation = query.Count();//firstStation即是索引 

⑤序列转换:
.ToArray();序列转换成数组;.ToList()序列转换成顺序表;

 public struct Point {    public double x;    public double y; } List<Point>Rl=new new List<Point>(); ………… ………… List<double> PaintX = RL.Select(s => s.x).ToList(); List<double> PaintY = RL.Select(s => s.y).ToList();
0 0
原创粉丝点击