常用的C#LINQ理解和运用

自从大二学习了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)Lambda表达式:

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

SomeDelegate obj=delegate(string mgs)
                              {
                                 Console.WriterLine("mgs");
                              }

其对应的lambda表达式:

SomeDelegate obj=mgs=>Console.WriterLine("mgs");

(3)LINQ查询语法:

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

IEnumerablquery=源集合.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;
 }
 ListRl=new new List();
 …………
 …………
 List<double> PaintX = RL.Select(s => s.x).ToList();
 List<double> PaintY = RL.Select(s => s.y).ToList();

你可能感兴趣的:(c#学习笔记)