Lambda表达式和查询表达式(2)高级使用

介绍
    ·First - 返回集合中的第一个元素;不延迟
    ·FirstOrDefault - 返回集合中的第一个元素(如果没有则返回默认值);不延迟
    ·Last - 返回集合中的最后一个元素;不延迟
    ·LastOrDefault - 返回集合中的最后一个元素(如果没有则返回默认值)
    ·ElementAt - 返回集合中指定索引的元素;不延迟
    ·ElementAtOrDefault - 返回集合中指定索引的元素(如果没有则返回默认值);不延迟
    ·Contains - 判断集合中是否包含有某一元素;不延迟
    ·Any - 判断集合中是否有元素满足某一条件;不延迟
    ·All - 判断集合中是否所有元素都满足某一条件;不延迟
    ·Count - 返回集合中的元素个数,返回int;不延迟
    ·LongCount - 返回集合中的元素个数,返回long;不延迟
    ·Sum - 集合应为数字类型集合,求其和;不延迟
    ·Min - 返回集合的最小值;不延迟
    ·Max - 返回集合的最大值;不延迟
    ·Average - 集合应为数字类型集合,求其平均值;不延迟
    ·Aggregate - 根据输入的表达式获取一个聚合值;不延迟
    ·Cast - 将集合转换为强类型集合;延迟
    ·DefaultIfEmpty - 查询结果为空则返回默认值;延迟
    ·SequenceEqual - 判断两个集合是否相同;不延迟
    ·OfType - 过滤集合中的指定类型;延迟
    ·ToArray - 将集合转换为数组;不延迟
    ·ToList - 将集合转换为List<T>集合;不延迟
    ·ToDictionary - 将集合转换为<K, V>集合;不延迟
1. Select
select 在一个集合序列按给定的条件进行投影,select 可以返回组合的筛选结果,返回匿名类型,对返回结果进行操作,返回组合的子查询结果等等。
select 的方法定义原形为:
public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)

该扩展方法是在Enumerable类型中定义的:
// 数据源的类型的属性
var result = from student in DataSource.Students
             where student.Name.Length > 3
             select student.Name;

// 数据源类型筛选后的结果
var result = from student in DataSource.Students
             where student.Name.Length > 3
             select student;

// 新类型
var result = from student in DataSource.Students
             where student.Name.Length > 3
             select new Student { Name = student.Name, StudentID = student.StudentID };

// 匿名类型
var result = from student in DataSource.Students
             where student.Name.Length > 3
             select new { Name = student.Name, StudentID = student.StudentID };

// 对返回结果进行操作
var result = from student in DataSource.Students
             where student.Name.Length > 3
             select student.ToString();

由Select方法原型可看出,返回结果为:IEnumerable<T>类型。

2. SelectMany
SelectMany定义原型为:
public static IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TResult>> selector)

通过原型可以看出,筛选结果的每一个元素类型都应该实现IEnumerable<T>接口:
string实现了IEnumerable<T>接口,可以构造这样的场景:查询组成学生姓名的所有字符序列。
var result = DataSource.Students.SelectMany(str => str.Name);

等价的Select 子句为:
var result = from student in DataSource.Students
             from ch in student.Name
             select ch;

可以认为SelectMany是将序列的每个元素投影到 IEnumerable<(Of <(T>)>) 并将结果序列合并为一个序列。

3.Distinct
原型为:
public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source)
去掉投影结果集的重复元素。该运算只能以方法调用的方式进行操作。
上面同样的场景:查询组成学生姓名的所有字符的不重复序列。
var result = DataSource.Students.SelectMany(str => str.Name).Distinct();

4. First、Last、Skip、Take、Single
First 选择集和的第一个元素。
var result = DataSource.Students.Select(student => student).First(); // Student ID:1,Student Name:Andy
Last 选择集和的最后一个元素。
var result = DataSource.Students.Select(student => student).Last(); // Student ID:4,Student Name:Dark
Skip 跳过N个元素。
var result = DataSource.Students.Select(student => student).Skip(2).Count(); // 2
Take 选择集合的前N个元素。
var result = DataSource.Students.Select(student => student).Skip(2).Take(1).Count(); // 1
Single 返回序列的唯一元素;如果该序列并非恰好包含一个元素,则会引发异常。
var result = DataSource.Students.Select(student => student).Single(); // 异常:Sequence contains more than one element

5. OrderBy[Descending]
对集合进行排序。
public static IOrderedEnumerable<TSource> OrderBy[Descending]<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector[, IComparer<TKey> comparer])
TKey必须已经实现了IComparer<T>接口。方法1:
var result = from student in DataSource.Students
             orderby student.Name descending
             select student.Name;
方法2:
var result = DataSource.Students.OrderByDescending(student => student.Name).Select(student => student.Name);
结果:
// Dark
// Cindy
// Bill
// Andy

1.  反射的应用

public static class GameConstants
{
    public static readonly string SCENE_STARTER = "_Starter";
    public static readonly string SCENE_MOVIETITLE = "MovieTitle";
    public static readonly string SCENE_BATTLE_UI = "Battle_UI";
    public static readonly string SCENE_BATTLE_RESULT_UI = "Battle_Result_UI";
    public static readonly string[] SCENES;
    // -----------------------------------------------------------
    public static readonly string CHARACTER_IDLE_ANIMATION_NAME = "Idle";
    public static readonly string CHARACTER_ATTACK_ANIMATION_NAME = "Attack";
    public static readonly string CHARACTER_DEATH_ANIMATION_NAME = "Dead";
    public static readonly string[] CHARACTER_ACTIONS;
    // -----------------------------------------------------------
    public static readonly string TAG_PLAYER_CHARACTER = "PlayerCharacter";
    public static readonly string TAG_ENEMY_CHARACTER  = "EnemyCharacter";
    public static readonly string[] TAGS;
    // ==================================
    static GameConstants()
    {
        SCENES = AggregatePublicStaticFields("SCENE_");
        CHARACTER_ACTIONS = AggregatePublicStaticFields("CHARACTER_ACTIONS_");
        TAGS = AggregatePublicStaticFields("TAG_");
    }
    private static string[] AggregatePublicStaticFields(string prefix)
    {
        var fields = typeof(GameConstants).GetFields(BindingFlags.Public | BindingFlags.Static);
        return fields.Where(x => x.Name.StartsWith(prefix)).Select(x => (string)x.GetValue(null)).ToArray();
    }
}

2. Unity中Transform的应用

  bool RetrieveFightZones()
  {
        var nodeTransform = stageInstance.transform.FindChildByPath(BattleConstants.StageConstants.FightZonesNodePath);
        foreach (Transform fightZoneTransform in nodeTransform)
        {
             fightZoneTransform
                .Cast<Transform>()              // 转化为Transform类型
                .Select(x => x.gameObject)      // x代表转化后的transform 然后取它的Gameobject
                .ToList()                       // 将GameObject转换为List<T>集合
                .ForEach(GameObject.Destroy);   // 循环销毁gameObject
        }
   }
void UpdatePositions(){
      // 转化为Transform选择位置 然后转化为数组 输出
      Positions = transform. Cast<Transform>() .Select(t => t.position) .ToArray();
}  
void SetupPositions()
{
      // 转化为Transform 将当前位置 转化为数组返回
      Positions = transform.Cast<Transform>().Select(x =>{var newPos = x.position; return newPos; }).ToArray();
}

3. Unity中IEnumerator一起应用

private IEnumerator InitializeBattleAsync()
{
    var charactersLoading = battleCharacterManager.CreateCharacters(         //参数1 将数组创建的数组CharacterCreationInfo 和 DebugAddMoreCharacters函数的前三个返回的结果链接 然后转化成数组
         new CharacterCreationInfo[]{new CharacterCreationInfo(CharacterType.Me)}.Concat(DebugAddMoreCharacters().Take(3)).ToArray()
         ,         // 参数2
         charas =>
         {
            allies = charas;
            battleSummonManager = new BattleSummonManager(summon);
            battleSummonManager.SetAllies(charas);
            battleFightManager.BeginBattle(battleSummonManager, new CharacterSelector(cameraFollowManager, enemies));
          }
      );
     yield return charactersLoading;
 }

private IEnumerable<CharacterCreationInfo> DebugAddMoreCharacters()
{
        yield return new CharacterCreationInfo(CharacterType.Helper, CharacterClass.Warrior);
        yield return new CharacterCreationInfo(CharacterType.Beast, CharacterClass.Warrior);
        yield return new CharacterCreationInfo(CharacterType.Beast, CharacterClass.Warrior);
        yield return new CharacterCreationInfo(CharacterType.Beast, CharacterClass.Warrior);
        yield break;
        var availableCharacterClasses = Enum.GetValues(typeof(CharacterClass))
            .Cast<CharacterClass>()
            .Take(4)  // filter out the player characters
            .Where(x => x != SceneManager.Instance.MyCharacterClass)
            .ToArray();
        yield return new CharacterCreationInfo(CharacterType.Helper, availableCharacterClasses[0]);
}
时间: 2024-10-15 00:45:34

Lambda表达式和查询表达式(2)高级使用的相关文章

Lambda表达式和查询表达式(1)基本概念

Lambda表达式也是一种匿名函数(anonymous function),比匿名方法具有更加简洁的表示形式.它可以包含表达式和语句,并且适用于创建委托和事件. 查询表达式: 是一种使用查询语法表示的表达式,它可以从一个或多个给定的数据源中检索数据,并制定检索结果的表现形式. Lambda表达式:  由输入参数.Lambda运算符和表达式(或语句块)构成. 它的语法形式如下: (input parameters) => empression; : input parameters : 表示输入参

查询表达式和LINQ to Objects

查询表达式实际上是由编译器“预处理”为“普通”的C#代码,接着以完全普通的方式进行编译.这种巧妙的发式将查询集合到了语言中,而无须把语义改得乱七八糟 LINQ的介绍 LINQ中的基础概念 降低两种数据模型之间的阻抗失配过程中,遇到的一个问题就是,通常会涉及创建另一个模型来作为桥梁 序列 它通过IEnumerable和IEnumerable<T>接口进行封装 序列和其他集合数据结构最大的区别:当你从序列读取数据的时候,通常不知道还有多少数据项等待读取,或者不能访问任意的数据项——只能是当前这个

LINQ查询表达式基础

LINQ,语言集成查询(Language Integrated Query)是一组用C#和Visual Basic语言的扩展. 对于编写查询的开发人员来说,LINQ 最明显的"语言集成"部分是查询表达式.查询表达式是使用 C# 3.0 中引入的声明性查询语法编写的.通过使用查询语法,你甚至可以使用最少的代码对数据源执行复杂的筛选.排序和分组操作.你使用相同的基本查询表达式模式来查询和转换 SQL 数据库.ADO.NET 数据集.XML 文档和流以及 .NET 集合中的数据. 下面我们通

LINQ 查询表达式(C# 编程指南)

语言集成查询 (LINQ) 是一组技术的名称,这些技术建立在将查询功能直接集成到 C# 语言(以及 Visual Basic 和可能的任何其他 .NET 语言)的基础上.  借助于 LINQ,查询现在已是高级语言构造,就如同类.方法.事件等等. 对于编写查询的开发人员来说,LINQ 最明显的"语言集成"部分是查询表达式.  查询表达式是使用 C# 3.0 中引入的声明性查询语法编写的.  通过使用查询语法,您甚至可以使用最少的代码对数据源执行复杂的筛选.排序和分组操作.  您使用相同的

Linq之查询表达式语法详解

1.闲言碎语 由于项目的需要接触到Linq,刚开始有些不适应,好多概念都很模糊.不过经过一段时间的摸索,慢慢地对Linq有了一个更加深入的了解.在此记录一下备忘.      2.查询表达式语法 执行Linq有两种方式,一种是方法形式eg:names.Contains('K');,另一种就是查询表达式eg:var query=from n in names select n; 下面用代码来详细解释. string[] fruitName = { "Apple", "Pear&q

C# 回顾之 查询表达式

目录 1. 查询表达式 2. 分类 3. 多义性 4. 转换 4.1 转换规则 4.2 转换示例 5.模式 1. 查询表达式 查询表达式 (query expression) 为查询提供一种类似于关系和分层查询语言(如 SQL 和 XQuery)的语言集成语法. 初始 from 子句后面可以跟零个或者多个 from.let.where.join 或 orderby 子句. 每个 from 子句都是一个生成器,该生成器将引入一个包括序列 (sequence) 的元素的范围变量 (range var

十五、C# 使用查询表达式的LINQ

使用查询表达式的LINQ 本章介绍了一种新的语法,查询表达式. 1.查询表达式概述 2.特点:投射  筛选  排序   Let  分组 3.作为方法调用 标准查询运算符所实现的查询在功能上与SQL中实现的查询非常相似 C#3.0中添加了一个新的语法:查询表达式. 本章将介绍新的查询表达式语法,并利用这个语法对上一章的许多查询进行表示. 一.查询表达式概述 除了遍历集合中的所有项之外,开发者经常要执行的另一个操作是对集合进行筛选,目的是 最终只需要遍历数量较少的项,或者对集合进行投射,使其中的项变

C# 标准查询表达式

一.标准查询运算符 1.C#提供了标准查询运算符,例如我想选择专利一系列(pantents)中以年份19开头的专利,可以用如下语句: IEnumerable<Patent> pantentWhere = pantents.Where(pantent => pantent.YearOfPublicaton.StartsWith("19")); 当然,此处的语句只是定义了查询,此时pantentWhere并没有内容,后面Lambda表达式指定的查询并没有执行,只有当遍历p

LINQ之路 5:LINQ查询表达式

书写LINQ查询时又两种语法可供选择:方法语法(Fluent Syntax)和查询表达式(Query Expression). LINQ方法语法的本质是通过扩展方法和Lambda表达式来创建查询.C# 3.0对于LINQ表达式还引入了声明式的查询表达式,也叫查询语法,通常来讲,它是创建LINQ查询的更加快捷的方式.尽管通过查询语法写出的查询比较类似于SQL查询,但实际上查询表达式的产生并不是建立在SQL之上,而是建立在函数式编程语言如LISP和Haskell中的list comprehensio