C# LINQ学习笔记二:LINQ标准查询操作概述

摘要:
标准查询运算符操作方法-筛选方法名说明C#查询表达式语法OfType根据值强制转

本笔记摘抄自:https://www.cnblogs.com/liqingwen/p/5801249.html,记录一下学习过程以备后续查用。

C# LINQ学习笔记二:LINQ标准查询操作概述第1张

“标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法,大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T>接口

或 IQueryable<T> 接口。标准查询运算符提供了包括筛选、投影、聚合、排序等功能在内的查询功能,各个标准查询运算符在执行时间上有所不同,具体情况

取决于它们是返回单一值还是值序列:

返回单一值的方法(例如Average和Sum)会立即执行,返回序列的方法会延迟查询执行,并返回一个可枚举的对象。

对于在内存中集合上运行的方法(即扩展IEnumerable<T>的方法),返回的可枚举对象将捕获传递到方法的参数。在枚举该对象时,将使用查询运算符的

逻辑,并返回查询结果。与之相反,扩展IQueryable<T>的方法不会实现任何查询行为,但会生成一个表示要执行的查询的表达式树,查询处理由源

IQueryable<T>对象处理。

一、按标准执行方式分类

标准查询运算符方法的LINQ to Objects实现采用两种主要方式之一来执行:立即执行和延迟执行,采用延迟执行的查询运算符可以进一步分为两类:流式和

非流式。

1、执行方式

立即执行:立即执行意味着在代码中声明查询的位置读取数据源并执行运算,返回单个不可枚举的结果的所有标准查询运算符都立即执行。

延迟执行:延迟执行意味着不在代码中声明查询的位置执行运算,仅当对查询变量进行枚举操作时才执行运算,例如通过使用foreach语句,这意味着查询的

执行结果取决于执行查询而非定义查询时的数据源内容。如果多次枚举查询变量,则每次结果可能都不同。几乎所有返回类型为IEnumerable<T>或

IOrderedEnumerable<TElement>的标准查询运算符都以延迟方式执行。

2、延迟执行

流式:运算符不需要在生成元素前读取所有源数据。在执行时,流式运算符一边读取每个源元素,一边对该源元素执行运算,并在可行时生成元素,流式运

算符将持续读取源元素直到可以生成结果元素,这意味着可能要读取多个源元素才能生成一个结果元素。

非流式:运算符必须读取所有源数据才能生成结果元素,诸如排序和分组等运算属于此类别。在执行时,非流式查询运算符读取所有源数据,将其放入数据

结构中,执行运算然后生成结果元素。

二、排列数据

排序操作按一个或多个特性对序列的元素进行排序。第一个排序条件对元素执行主要排序,通过指定第二个排序条件,可以对各个主要排序组中的元素进行

排序。
下图演示对一个字符序列按字母排序操作的执行结果 :

C# LINQ学习笔记二:LINQ标准查询操作概述第2张

标准查询运算符操作方法 -排序
方法名说明C# 查询表达式语法
OrderBy按升序对值进行排序。orderby
OrderByDescending按降序对值进行排序。orderby … descending
ThenBy按升序执行次要排序。orderby …, …
ThenByDescending按降序执行次要排序。orderby …, … descending
Reverse颠倒集合中的元素的顺序。X

下面代码演示orderby升序排序:

C# LINQ学习笔记二:LINQ标准查询操作概述第3张C# LINQ学习笔记二:LINQ标准查询操作概述第4张
    classProgram
    {
        static void Main(string[] args)
        {
            #region LINQ orderby升序排序
            var words = new[] { "the", "quick", "brown", "fox", "jumps"};
            var query = 
                from word inwords
                orderbyword.Length
                selectword;
            foreach (var word inquery)
            {
                Console.WriteLine(word);
            }
            Console.Read();
            #endregion}
    }
View Code

运行结果如下:

C# LINQ学习笔记二:LINQ标准查询操作概述第5张

下面代码演示orderby降序排序:

C# LINQ学习笔记二:LINQ标准查询操作概述第3张C# LINQ学习笔记二:LINQ标准查询操作概述第7张
    classProgram
    {
        static void Main(string[] args)
        {
            #region LINQ orderby降序排序
            var words = new[] { "the", "quick", "brown", "fox", "jumps"};
            var query = 
                from word inwords
                orderby word.Substring(0, 1) descending
                selectword;
            foreach (var word inquery)
            {
                Console.WriteLine(word);
            }
            Console.Read();
            #endregion}
    }
View Code

运行结果如下:

C# LINQ学习笔记二:LINQ标准查询操作概述第8张

下面代码演示orderby主要和次要排序(示例一):

C# LINQ学习笔记二:LINQ标准查询操作概述第3张C# LINQ学习笔记二:LINQ标准查询操作概述第10张
    classProgram
    {
        static void Main(string[] args)
        {
            #region LINQ orderby主要和次要排序示例一
            var words = new[] { "the", "quick", "brown", "fox", "jumps"};
            var query = 
                from word inwords
                orderby word.Length, word.Substring(0, 1)
                selectword;
            foreach (var word inquery)
            {
                Console.WriteLine(word);
            }
            Console.Read();
            #endregion}
    }
View Code

运行结果如下:

C# LINQ学习笔记二:LINQ标准查询操作概述第11张

下面代码演示orderby主要和次要排序(示例二):

C# LINQ学习笔记二:LINQ标准查询操作概述第3张C# LINQ学习笔记二:LINQ标准查询操作概述第13张
    classProgram
    {
        static void Main(string[] args)
        {
            #region LINQ orderby主要和次要排序示例二
            var words = new[] { "the", "quick", "brown", "fox", "jumps"};
            var query = 
                from word inwords
                orderby word.Length, word.Substring(0, 1) descending
                selectword;
            foreach (var word inquery)
            {
                Console.WriteLine(word);
            }
            Console.Read();
            #endregion}
    }
View Code

运行结果如下:

C# LINQ学习笔记二:LINQ标准查询操作概述第14张

三、Set 操作

LINQ中的Set操作是指根据相同或不同集合中是否存在等效元素来生成结果集的查询操作。

标准查询运算符操作方法 -Set
方法名说明

C# 查询表达式语法

Distinct

从集合移除重复值。

X

Except

返回差集,差集是指位于一个集合但不位于另一个集合的元素。

X

Intersect

返回交集,交集是指同时出现在两个集合中的元素。

X

Union

返回并集,并集是指位于两个集合中任一集合的唯一的元素。

X

图解Set操作

1、Distinct: 返回的序列包含输入序列的唯一元素。

C# LINQ学习笔记二:LINQ标准查询操作概述第15张

2、Except: 返回的序列只包含位于第一个输入序列但不位于第二个输入序列的元素。

C# LINQ学习笔记二:LINQ标准查询操作概述第16张

3、Intersect: 返回的序列包含两个输入序列共有的元素。

C# LINQ学习笔记二:LINQ标准查询操作概述第17张

4、Union: 返回的序列包含两个输入序列的唯一的元素。

C# LINQ学习笔记二:LINQ标准查询操作概述第18张

四、过滤数据

筛选指将结果集限制为只包含某些满足指定条件的元素的操作,它又称为选择。

下图演示了对字符序列进行筛选的结果,筛选操作的谓词指定字符必须为“A”。

C# LINQ学习笔记二:LINQ标准查询操作概述第19张

标准查询运算符操作方法 -筛选
方法名说明C# 查询表达式语法
OfType根据值强制转换为指定类型的能力选择值。X
Where选择基于谓词函数的值。where

下面代码演示过滤数据:

C# LINQ学习笔记二:LINQ标准查询操作概述第3张C# LINQ学习笔记二:LINQ标准查询操作概述第21张
    classProgram
    {
        static void Main(string[] args)
        {
            #region LINQ 过滤数据
            string[] words = { "the", "quick", "brown", "fox", "jumps"};
            var query = 
                from word inwords
                where word.Length == 3
                selectword;
            foreach (var word inquery)
            {
                Console.WriteLine(word);
            }
            Console.Read();
            #endregion}
    }
View Code

运行结果如下:

C# LINQ学习笔记二:LINQ标准查询操作概述第22张

五、量词操作

限定符运算返回一个Boolean值,该值指示序列中是否有一些元素满足条件或是否所有元素都满足条件。

下图描述了两个不同源序列上的两个不同限定符运算。第一个运算询问是否有一个或多个元素为字符“A”,结果为true,第二个运算询问是否所有元素都为字

符“A”,结果为true。

C# LINQ学习笔记二:LINQ标准查询操作概述第23张

标准查询运算符操作方法 -量词

方法名

说明

C# 查询表达式语法

All

确定是否序列中的所有元素都满足条件。

X
Any

确定序列中是否有元素满足条件。

X

Contains

确定序列是否包含指定的元素。

X

六、投影操作

投影是指将对象转换为一种新形式的操作,该形式通常只包含那些将随后使用的属性。通过使用投影,您可以构建依据每个对象生成的新类型,还可以映射

属性,并对该属性执行数学函数,另外还可以在不更改原始对象的情况下映射该对象。

标准查询运算符操作方法 -投影
方法名说明C# 查询表达式语法
Select映射基于转换函数的值。select
SelectMany映射基于转换函数的值序列,然后将它们展平为一个序列。使用多个from 子句

下面代码演示Select:

C# LINQ学习笔记二:LINQ标准查询操作概述第3张C# LINQ学习笔记二:LINQ标准查询操作概述第25张
    classProgram
    {
        static void Main(string[] args)
        {
            #region LINQ Select
            var words = new[] { "the", "quick", "brown", "fox", "jumps"};
            var query = 
                from word inwords
                select word.Substring(0, 1);
            foreach (var word inquery)
            {
                Console.WriteLine(word);
            }
            Console.Read();
            #endregion}
    }
View Code

运行结果如下:

C# LINQ学习笔记二:LINQ标准查询操作概述第26张

下面代码演示SelectMany:

C# LINQ学习笔记二:LINQ标准查询操作概述第3张C# LINQ学习笔记二:LINQ标准查询操作概述第28张
    classProgram
    {
        static void Main(string[] args)
        {
            #region LINQ SelectMany
            var phrases = new List<string>() { "an apple a day", "the quick brown fox"};
            var query = 
                from phrase inphrases
                    from word in phrase.Split(' ')
                    selectword;
            foreach (var word inquery)
            {
                Console.WriteLine(word);
            }
            Console.Read();
            #endregion}
    }
View Code

运行结果如下:

C# LINQ学习笔记二:LINQ标准查询操作概述第29张

Select()SelectMany()的工作都是依据源值生成一个或多个结果值。Select()为每个源值生成一个结果值。因此,总体结果是一个与源集合具有相同元素数

目的集合。与之相反,SelectMany()将生成单一总体结果,其中包含来自每个源值的串联子集合。作为参数传递到SelectMany()的转换函数必须为每个源值返

回一个可枚举值序列,然后,SelectMany()将串联这些可枚举序列以创建一个大的序列。

下面两个插图演示了这两个方法的操作之间的概念性区别。在每种情况下,假定选择器(转换)函数从每个源值中选择一个由花卉数据组成的数组。

下图描述Select()如何返回一个与源集合具有相同元素数目的集合。

C# LINQ学习笔记二:LINQ标准查询操作概述第30张

下图描述SelectMany()如何将中间数组序列串联为一个最终结果值,其中包含每个中间数组中的每个值。

C# LINQ学习笔记二:LINQ标准查询操作概述第31张

下面的示例比较Select()SelectMany()的行为。代码将通过从源集合的每个花卉名称列表中提取前两项来创建一个“花束”。在此示例中,转换函数Select使用

的“单一值”本身就是一个值集合。这需要额外的foreach循环,以便枚举每个子序列中的每个字符串。

C# LINQ学习笔记二:LINQ标准查询操作概述第3张C# LINQ学习笔记二:LINQ标准查询操作概述第33张
    /// <summary>
    ///花束类
    /// </summary>
    classBouquet
    {
        public List<string> Flowers { get; set; }
    }
    
    classProgram
    {
        static void Main(string[] args)
        {
            #region LINQ Select和SelectMany比较
            var bouquets = new List<Bouquet>()
            {
                new Bouquet {Flowers = new List<string> {"sunflower", "daisy", "daffodil", "larkspur"}},
                new Bouquet {Flowers = new List<string> {"tulip", "rose", "orchid"}},
                new Bouquet {Flowers = new List<string> {"gladiolis", "lily", "snapdragon", "aster", "protea"}},
                new Bouquet {Flowers = new List<string> {"larkspur", "lilac", "iris", "dahlia"}}
            };

            IEnumerable<List<string>> query1 = bouquets.Select(bq =>bq.Flowers);
            IEnumerable<string> query2 = bouquets.SelectMany(bq =>bq.Flowers);

            Console.WriteLine("query1->Select():");
            foreach (IEnumerable<string> collection inquery1)
            {
                foreach (var item incollection)
                {
                    Console.WriteLine(item);
                }
            }

            Console.WriteLine("query2->SelectMany():");
            foreach (var item inquery2)
            {
                Console.WriteLine(item);
            }

            Console.Read();
            #endregion}
    }
View Code

运行结果如下:

C# LINQ学习笔记二:LINQ标准查询操作概述第34张

七、划分数据

LINQ 中的分区指的是在不重新排列元素的情况下,将输入序列划分为两部分,然后返回其中一个部分的操作。

下图显示对一个字符序列执行三个不同的分区操作的结果。第一个操作返回序列中的前三个元素;第二个操作跳过前三个元素,返回剩余的元素;第三个操作

跳过序列中的前两个元素,返回接下来的三个元素。

C# LINQ学习笔记二:LINQ标准查询操作概述第35张

分区序列的标准查询运算符方法

运算符名称

说明

C# 查询表达式语法

Skip

跳过序列中的指定位置之前的元素。

X

SkipWhile

基于谓词函数跳过元素,直到某元素不再满足条件。

X

Take

提取序列中的指定位置之前的元素。

X

TakeWhile

基于谓词函数提取元素,直到某元素不再满足条件。X

八、联接操作

将两个数据源“联接”就是将一个数据源中的对象与另一个数据源中共享某个通用特性的对象关联起来。

当查询所面向的数据源相互之间具有无法直接领会的关系时,联接就成为一项重要的运算。在面向对象的编程中,这可能意味着在未建模对象之间进行关联,

例如对单向关系进行反向推理。

LINQ 框架中提供的联接方法包括JoinGroupJoin。这些方法执行同等联接,即根据两个数据源的键是否相等来匹配这两个数据源的联接。(与此相较,

Transact-SQL支持除“等于”之外的联接运算符,例如“小于”运算符。)用关系数据库术语表达,就是说Join实现了内部联接,这种联接只返回那些在另一个数据集

中具有匹配项的对象。GroupJoin方法在关系数据库术语中没有直接的等效项,但它实现了内部联接和左外部联接的超集。左外部联接是这样一种联接:它返回第

一个(左)数据源的每个元素,即使该元素在另一个数据源中没有关联元素。

下图显示了一个概念性视图,其中包含两个集合以及这两个集合中的包含在内部联接或左外部联接中的元素。

C# LINQ学习笔记二:LINQ标准查询操作概述第36张

标准查询运算符操作方法 -联接

方法名

描述

C# 查询表达式语法

Join

根据键选择器函数联接两个序列并提取值对。

join … in … on … equals …

GroupJoin

根据键选择器函数联接两个序列,并对每个元素的结果匹配项进行分组。

join … in … on … equals … into …

九、分组数据

分组指将数据放入组中以便每个组中的元素共享公共特性的操作。

下图显示了对字符序列进行分组的结果,每个组的键是字符。

C# LINQ学习笔记二:LINQ标准查询操作概述第37张

标准查询运算符方法 - 分组

方法名

说明

C# 查询表达式语法

GroupBy

对共享公共特性的元素进行分组。每个组都由一个IGrouping<TKey, TElement>对象表示。

group … by

- 或 -

group … by … into …

ToLookup

根据键选择器函数将元素插入到Lookup<TKey, TElement>(一个一对多字典)中。

X

下面代码演示分组数据:

C# LINQ学习笔记二:LINQ标准查询操作概述第3张C# LINQ学习笔记二:LINQ标准查询操作概述第39张
    classProgram
    {
        static void Main(string[] args)
        {
            #region LINQ 分组数据
            var numbers = new List<int>() { 35, 44, 200, 84, 3987, 4, 199, 329, 446, 208};
            IEnumerable<IGrouping<bool, int>> query = from number innumbers
                                                      group number by number % 2 == 0;
            foreach (var group inquery)
            {
                Console.WriteLine($"{(group.Key ? "偶数": "基数")}:");
                foreach (var item ingroup)
                {
                    Console.WriteLine(item);
                }
            }
            Console.Read();
            #endregion}
    }
View Code

运行结果如下:

C# LINQ学习笔记二:LINQ标准查询操作概述第40张

十、生成操作

生成是指创建新的值序列。

标准查询运算符方法 - 生成

方法名

说明

C# 查询表达式语法

DefaultIfEmpty

将空集合替换为具有默认值的单一实例集合。

X
Empty

返回空集合。

X
Range

生成包含数字序列的集合。

X

Repeat

生成包含一个重复值的集合。

X

十一、等值操作

如果两个序列的对应元素相等且这两个序列具有相同数量的元素,则视这两个序列相等。

标准查询运算符方法 - 等值
方法名说明C# 查询表达式语法
SequenceEqual通过成对地比较元素确定两个序列是否相等。X

十二、元素操作

元素操作从一个序列返回单个特定元素。

标准查询运算符操作方法 -元素

方法名

说明

C# 查询表达式语法

ElementAt

返回集合中指定索引处的元素。

X

ElementAtOrDefault

返回集合中指定索引处的元素;如果索引超出范围,则返回默认值。

X

First

返回集合中的第一个元素或满足条件的第一个元素。

X

FirstOrDefault

返回集合中的第一个元素或满足条件的第一个元素。如果没有这样的元素,则返回默认值。

X
Last

返回集合中的最后一个元素或满足条件的最后一个元素。

X

LastOrDefault

返回集合中的最后一个元素或满足条件的最后一个元素。如果没有这样的元素,则返回默认值。

X

Single

返回集合中的唯一元素或满足条件的唯一元素。

X

SingleOrDefault

返回集合中的唯一元素或满足条件的唯一元素。如果没有这样的元素或集合不是正好包含一个元素,则返回默认值。

X

十三、转换数据类型

转换方法更改输入对象的类型。

LINQ查询中的转换运算可用于各种应用程序,下面是一些示例:

1、Enumerable.AsEnumerable<TSource>方法可用于隐藏类型的标准查询运算符的自定义实现。

2、Enumerable.OfType<TResult>方法可用于启用非参数化集合以进行LINQ查询。

3、Enumerable.ToArray<TSource>Enumerable.ToDictionary<TSource, TKey>Enumerable.ToList<TSource>Enumerable.ToLookup<TSource, TKey>

方法可用于强制立即执行查询,而非推迟到枚举查询时。

标准查询运算符方法 - 转换数据类型
方法名说明C# 查询表达式语法
AsEnumerable返回类型为IEnumerable<T>的输入。X
AsQueryable将(泛型)IEnumerable转换为(泛型)IQueryableX
Cast将集合的元素强制转换为指定类型。

使用显式类型化的范围变量。例如:

from string str in words

OfType根据值强制转换为指定类型的能力筛选值。X
ToArray将集合转换为数组。此方法强制执行查询。X
ToDictionary根据键选择器函数将元素放入Dictionary<TKey, TValue>中。此方法强制执行查询。X
ToList将集合转换为List<T>此方法强制执行查询。X
ToLookup根据键选择器函数将元素放入Lookup<TKey, TElement>(一对多字典)中。此方法强制执行查询。X

下面代码演示转换数据类型:

C# LINQ学习笔记二:LINQ标准查询操作概述第3张C# LINQ学习笔记二:LINQ标准查询操作概述第42张
    /// <summary>
    ///植物类
    /// </summary>
    classPlant
    {
        public string Name { get; set; }
    }

    /// <summary>
    ///食肉植物类
    /// </summary>
    classCarnivorousPlant : Plant
    {
        public string TrapType { get; set; }
    }

    classProgram
    {
        static void Main(string[] args)
        {
            #region LINQ 转换数据类型
            var plants = newPlant[]
            {
                new CarnivorousPlant {Name = "Venus Fly Trap", TrapType = "Snap Trap"},
                new CarnivorousPlant {Name = "Pitcher Plant", TrapType = "Pitfall Trap"},
                new CarnivorousPlant {Name = "Sundew", TrapType = "Flypaper Trap"},
                new CarnivorousPlant {Name = "Waterwheel Plant", TrapType = "Snap Trap"}
            };
            var query = from CarnivorousPlant plant inplants
                        where plant.TrapType == "Snap Trap"
                        selectplant;
            foreach (var carnivorousPlant inquery)
            {
                Console.WriteLine(carnivorousPlant.Name);
            }
            Console.Read();
            #endregion}
    }
View Code

运行结果如下:

C# LINQ学习笔记二:LINQ标准查询操作概述第43张

十四、串联操作

串联是指将一个序列追加到另一个序列的运算。

下图演示对两个字符序列执行的串联运算。

C# LINQ学习笔记二:LINQ标准查询操作概述第44张

标准查询运算符操作方法 - 串联

方法名

说明

C# 查询表达式语法

Concat

串联两个序列以组成一个序列。

X

十五、聚合操作

聚合运算从值集合计算单个值。从一个月的日温度值计算日平均温度就是聚合运算的一个示例。

下图显示了对一个数字序列执行两个不同聚合运算的结果。第一个运算对这些数字执行求和;第二个运算返回该序列中的最大值。

C# LINQ学习笔记二:LINQ标准查询操作概述第45张

标准查询运算符操作方法 - 聚合

方法名

说明

C# 查询表达式语法

Aggregate

对集合值执行自定义聚合运算。

X

Average

计算值集合的平均值。

X
Count

对集合中的元素进行计数,还可以仅对满足某一谓词函数的元素进行计数。

X

LongCount

对大型集合中的元素进行计数,还可以仅对满足某一谓词函数的元素进行计数。

X
Max

确定集合中的最大值。

X
Min

确定集合中的最小值。

X

Sum

计算集合中值的总和。

X

免责声明:文章转载自《C# LINQ学习笔记二:LINQ标准查询操作概述》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇AcWing 2879. 画中漂流(简单DP)大文件上传 之 改版了的SlickUpload.HttpUploadModule(Krystalware.SlickUpload.dll)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java 之 clone 方法(对象拷贝)

一、对象的克隆(拷贝)   克隆的对象包含一些已经修改过的属性,而 new 出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠克隆方法了。 二、克隆分类   1、克隆对象前提 protected native Object clone() throws CloneNotSupportedException;     ...

java过滤特殊字符的正则表达式

// 过滤特殊字符 public staticString StringFilter(String str) throws PatternSyntaxException { // 只允许字母和数字 // String regEx ="[^a-zA-Z0-9]"; // 清除掉所有特殊字符 String regEx="[`~!@#$%^&*()+...

SpringBoot 整合EasyExcel 获取动态Excel列名

导读 最近负责消息网关,里面有个短信模板导入功能,因为不同模板编号对应不同参数,导入后的数据定时发送,涉及到Excel中列名不固定问题,于是想根据列名+值,组合成一个大JSON,具体代码如下。 引入依赖 <dependency> <groupId>com.alibaba</groupId...

C#导出Excel-利用特性自定义数据

 网上C#导出Excel的方法有很多。但用来用去感觉不够自动化。于是花了点时间,利用特性做了个比较通用的导出方法。只需要根据实体类,自动导出想要的数据  1.在NuGet上安装Aspose.Cells或者用微软自带类库也可以  2.需要导出的数据的实例类: using System.ComponentModel; using System.Re...

Android 路由框架ARouter最佳实践

一:什么是路由? 说简单点就是映射页面跳转关系的,当然它也包含跳转相关的一切功能。 二:为什么需要路由 Android系统已经给我们提供了api来做页面跳转,比如startActivity,为什么还需要路由框架呢?我们来简单分析下路由框架存在的意义: 在一些复杂的业务场景下(比如电商),灵活性比较强,很多功能都是运营人员动态配置的,比如下发一个活动页面...

图片像素的数值运算和逻辑运算及对比度调节

         一、算术运算:这个主要包括---------加、减 、乘、除;                 1、进行两张照片相加处理,利用它自带的add()函数处理: 1 import cv2 as cv 2 3 def shu_image(m1,m2): 4 src=cv.add(m1,m2) #进行相加处理 5...