Linq基础知识小记

1、LINQ(语言级集成查询)的作用就是提供一种统一且对称的方式,让程序员在广义的数据上获取和操作数据。广义的数据包括XML文档数据、元数据、System.Data.dll和System.Data.SqlClient.dll提供的DataSet和DataTable等数据、内存数据(Array、Collection)等.

2、Linq To Object是针对实现了IEnumerable<T>的对象操作或获取数据的功能,代码如下:

(1)、通过Enumerable的实例方法实现查询

string[] str = {"Tom", "Dick", "Harry"};
IEnumerable<string> filteredNames = Enumerable.Where(str, delegate(string s)
{
    return s.Length > 2;
});
foreach (var name in filteredNames)
{
   Console.WriteLine(name);
}

(2)、使用扩展方法

因为查询预算符是以扩展方法的形式实现的,所以如下代码也可以:

string[] str = {"Tom", "Dick", "Harry"};
var filteredNames = str.Where(n=>n.Length>4);

foreach (var name in filteredNames)
{
      Console.WriteLine(name);
}

(3)、使用查询表达式语法

C#提供了一种类似sql语句的写法来操作集合数据,代码如下:

string[] str = {"Tom", "Dick", "Harry"};
var filteredNames = from n in str
where n.Length > 4 & n.Contains(‘a‘)
select n;

foreach (var name in filteredNames)
{
   Console.WriteLine(name);
}

3、扩展方法

Linq的大多数查询操作方法是扩展方法

what is expended method?  请参考

4、代码写法分析

当使用Linq对集合数据进行操作查询时,往往有很多种方法,这里主要分析的是传统委托方法和匿名方法和Lambda表达式.

举个例子查询一个List<int>()集合中的偶数项.

(1)、传统委托方法

        static void Main(string[] args)
        {
            List<int> list=new List<int>();
            list.AddRange(new int[]{6,66,1,2,3,45});
            Predicate<int> pre = new Predicate<int>(IsNumber);
            var res = list.FindAll(pre);;
            foreach (var item in res)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }

        static bool IsNumber(int i)
        {
            return i % 2 == 0;
        }

(2)、升级,匿名方法取代传统委托

            List<int> list=new List<int>();
            list.AddRange(new int[]{6,66,1,2,3,45});
            Predicate<int> pre = new Predicate<int>(delegate(int i)
            {
                return i % 2 == 0;
            });
            var res = list.FindAll(pre);;
            foreach (var item in res)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();        

(3)、最后,Lambda登场

            List<int> list=new List<int>();
            list.AddRange(new int[]{6,66,1,2,3,45});
            var res = list.FindAll(n=>n%2==0);;
            foreach (var item in res)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();        

5、对象初始化

(1)、常规初始化

public class Test
{
        public string A{ get; set; }
        public string B{ get; set; }
}

static void Main()
{
        Test te=new Test{A=‘a‘,B=‘b‘};
};

(2)、内部对象初始化

public class Rectangle
    {
        public Point TopLeft { get; set; }
        public Point BottomRight { get; set; }
    }

    static void CompareObjectInitMethods()
    {
        // 传统初始化方法
        Rectangle r = new Rectangle();
        Point p1 = new Point();
        p1.X = 10;
        p1.Y = 10;
        r.TopLeft = p1;
        Point p2 = new Point();
        p2.X = 20;
        p2.Y = 20;
        r.BottomRight = p2;

        // 对象初始化语法
        Rectangle r2 = new Rectangle
        {
            TopLeft = new Point { X = 10, Y = 10 },
            BottomRight = new Point { X =   20, Y = 20 }
        };
    }

(3)、集合初始化

static void CollectionInitSyntax()
        {
            // 初始化标准数组
            int[] numbers = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

            // 初始化一个ArrayList
            ArrayList list = new ArrayList { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

            // 初始化一个List<T>泛型容器
            List<int> list2 = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

            // 如果容器存放的是非简单对象
            List<Point> pointList = new List<Point>
            {
                new Point { X = 2, Y = 2},
                new Point { X = 3, Y = 3}
            };

            // 使用恰当的缩进和嵌套的大括号会使代码易于阅读,同时节省我们的输入时间
            // 想想如果不使用初始化语法构造如下的List,将需要多少行代码
            List<Rectangle> rectList = new List<Rectangle>
            {
                new Rectangle { TopLeft = new Point { X = 1, Y = 1},
                    BottomRight = new Point { X = 2, Y = 2}},
                new Rectangle { TopLeft = new Point { X = 3, Y = 3},
                    BottomRight = new Point { X = 4, Y = 4}},
                new Rectangle { TopLeft = new Point { X = 5, Y = 5},
                    BottomRight = new Point { X = 6, Y = 6}}
            };
        }
时间: 2024-08-30 05:32:05

Linq基础知识小记的相关文章

Linq基础知识小记三

1.子查询 Linq中的子查询思想和Sql中的子查询其实差不多, 对于方法语法,一个子查询包含在另一个子查询的Lambda表达式中,代码如下: string[] names = { "James", "Kobe", "Curry", "Durrent" }; IEnumerable<string> result = names.OrderBy(n => n.Split().Last()); n.Split()

EF基础知识小记一

1.EF等ORM解决方案出现的原因 因为软件开发中分析和解决问题的方法已经接近成熟,然后关系型数据库却没有,很多年来,数据依然是保存在表行列这样的模式里,所以,在面相对象和高度标准化的数据库中产生了一个失配(不匹配.阻抗失配,微软的安德斯.海尔斯伯格<C#之父>可能会这样叫它),为了解决这个失配,大多数项目中都会引入"数据处理层"来转换应用程序实体层的数据到数据库的行和列中,随着"数据处理层"的不断进化,最后ORM就诞生了. 2.集成查询语言LINQ L

web基础知识小记

<!doctype html><html lang="en"> <head>  <meta charset="UTF-8">  <meta name="Generator" content="EditPlus®">  <meta name="Author" content="">  <meta name=&qu

你得学会并且学得会的Socket编程基础知识

这一篇文章,我将图文并茂地介绍Socket编程的基础知识,我相信,如果你按照步骤做完实验,一定可以对Socket编程有更好地理解. 本文源代码,可以通过这里下载 http://files.cnblogs.com/chenxizhang/SocketWorkshop.rar 第一步:创建解决方案 第二步:创建服务端程序 这里可以选择“Console Application”这个类型,比较方便调试 然后编写如下代码,实现服务器的基本功能 using System; using System.Coll

C#反射基础知识和实战应用

首先来说一下什么是反射? 反射提供了封装程序集.模块和类型的对象(Type类型) 可以使用反射动态的创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后,可以调用类型的方法或访问其字段和属性 . 总之,有了反射,以前很多实现不了的功能都可以实现. 下面先来写一个小例子,体验一下反射是怎么一回事: 打开VS2010,新建一个控制台应用程序,在program.cs里面写代码 首先引入命名空间: using System.Reflection; 下如下代码: PropertyInfo l

C# 基础知识 (四).C#简介及托管代码

        暑假转瞬即逝,从10天的支教生活到1周的江浙沪旅游,在这个漫长的暑假中我经历了很多东西,也学到了很多东西,也认识到了很多不足之处!闲暇之余我准备重新进一步巩固C#相关知识,包括C#入门知识.C#并行开发.ASP网站等.这篇文章我介绍的是书籍--C#入门经典(Beginning C#) 作者Karli Watson.主要包括的是我自己缺乏的一些C#简介知识和托管代码的内容.内容比较简单,参照该书籍较多,相当于自己的在线笔记!                             

背水一战 Windows 10 (56) - 控件(集合类): ListViewBase - 基础知识, 拖动项

原文:背水一战 Windows 10 (56) - 控件(集合类): ListViewBase - 基础知识, 拖动项 [源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 控件(集合类 - ListViewBase) 基础知识 拖动项 示例1.ListViewBase 的基础知识Controls/CollectionControl/ListViewBaseDemo/ListViewBaseDemo1.xaml <Page x:Class="Windows10.Con

背水一战 Windows 10 (50) - 控件(集合类): ItemsControl - 基础知识, 数据绑定, ItemsPresenter, GridViewItemPresenter, ListViewItemPresenter

原文:背水一战 Windows 10 (50) - 控件(集合类): ItemsControl - 基础知识, 数据绑定, ItemsPresenter, GridViewItemPresenter, ListViewItemPresenter [源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 控件(集合类 - ItemsControl) 基础知识 数据绑定 ItemsPresenter GridViewItemPresenter ListViewItemPresent

C#基础知识简单梳理

C#基础知识简单梳理 本文是转发博友的总结,方便自己以后随时温习: 1.值类型和引用类型 1.1堆和栈 简单的说值类型存放在堆栈上面,引用类型的数据存放在托管堆上面(它的引用地址却存放在堆栈上面)! 栈:它是一个内存数组,是一个先进后出的数据结构! 栈的特征:数据只能从栈顶进,从栈顶出! 堆:它是一个内存区域,可以分配大块区域存储某类型的数据,与栈不同的是它里面的数据可以任意排序和移除! 下面是园子的一张图,贴上来供大家参考啊! 问     题 值  类  型 引 用 类 型 这个类型分配在哪里