C# LINQ的基础使用方法

2023-11-11

关键字  from、in、where、select、orderby、descending

例子 Linq的简单运用

1.用Linq查询集合中所有符合条件的内容(表达式写法)

var result = from temp(临时变量) in myList(要查询的集合) where temp.age<35(判断条件)  select temp.name; (表示将查询到的集合返回,temp.name表示将所有符合条件的内容,放在一个集合中返回)  

(上图的结果,是返回所有满足条件的数据的名字,当然你可以返回自己定义的任何数据)

2.扩展方法的写法:List中有一个扩展方法where,where扩展方法中有一个Func的委托类型,需要传入一个比较的方法进去,该方法要有一个bool类型的返回值,方法内部写判断条件,whele方法会将所有符合条件的内容返还给Temp。(注意:要使用该扩展方法,首先要引入System.Linq的命名空间)

如果嫌定义一个方法太麻烦,我们可以使用lambda表达式

以上是lambda表达式的完全体和简写,如果判断方法过多,要使用完全体写,并且要有返回值,因为whele方法中需要传入的是一个Func<TSource,bool>,需要有一个bool类型的返回值。

3.多集合的联合查询:

假设我们有这两套数据结构

public enum Stage
{
    练气期 = 1,
    筑基期 = 2,
    结丹期 = 3,
    元婴期 = 4,
    化神期 = 5,
    练虚期 = 6,
    合体期 = 7,
    大乘期 = 8,
    真仙大成 = 9
}
/// <summary>
/// 修仙者的数据结构
/// </summary>
public class FairyCutter
{
    public string Name {get; set;}//修仙者名称
    public int Age { get; set; }//修仙者年龄
    public string ArtifactName { get; set; }//使用的法器
    public Stage Stage{ get; set;}//修仙者等级
    public FairyCutter(string name,int age, string artifactName,Stage stage)
    {
        Name = name;
        Age = age;
        ArtifactName= artifactName;
        Stage = stage;
    }
    public override string ToString()
    {
        return string.Format("名字:{0},年龄:{1},阶段:{2}", Name, Age, Stage);
    }
}
/// <summary>
/// 法器的数据结构
/// </summary>
public class Artifact
{
    public string ArtifactName { get; set; }//名字
    public float KillingRange { get; set; }//杀伤范围
    public float InjuryValue { get; set; }//伤害值

    public Artifact(string artifactName, float killingRange, float injuryValue)
    {
        ArtifactName = artifactName;
        KillingRange = killingRange;
        InjuryValue = injuryValue;
    }

    public override string ToString()
    {
        return string.Format("法器名称:{0},杀伤范围:{1},伤害值:{2}", ArtifactName, KillingRange, InjuryValue);
    }
}
public class Study : MonoBehaviour
{
    List<FairyCutter> fairyCutters = new List<FairyCutter>()
    {
        new FairyCutter("韩立",11,"青元剑",Stage.元婴期),
        new FairyCutter("樊瑞",25,"自私自利",Stage.练气期),
        new FairyCutter("火林",26,"九阳神功",Stage.结丹期),
        new FairyCutter("大米",26,"大喇叭",Stage.结丹期),
        new FairyCutter("扳机子",26,"猪猪如里里",Stage.元婴期),
        new FairyCutter("小米",26,"青元剑",Stage.筑基期),
        new FairyCutter("小胡子",26,"说话不算数",Stage.结丹期)
    };
    List<Artifact> artifacts = new List<Artifact>()
    {
        new Artifact("青元剑",100,99),
        new Artifact("说话不算数",1,99),
        new Artifact("大喇叭",100,71),
        new Artifact("猪猪如里里",64,25),
        new Artifact("九阳神功",70,89),
        new Artifact("自私自利",1,99),
    };
}

我们想要查询结丹期以上,并且法器的伤害值>90 的法师 ,用Linq应该怎么查呢?

方法一:Linq表达式

  void Start()
    {
        //联合查询结丹期以上,并且法器的伤害值>80的法师
        //Linq表达式写法:
        var result = from temp1 in fairyCutters
                     from temp2 in artifacts
                     where (int)temp1.Stage >= 3 && temp1.ArtifactName == temp2.ArtifactName && temp2.InjuryValue > 80
                     //orderby temp1.Stage descending//orderby 关键字,对结果进行排序,后边跟排序的依据,这里是根据等级排序,结果是默认从小到大排序,.descending关键字,让集合从大到小排序。
                     orderby temp1.Stage,temp1.Age //多字段进行排序
                     select temp1;

        foreach (var item in result)
        {
            Debug.Log(item);
        }
    }

方法二:扩展方法查询

首先使用扩展方法SelectMany()将两个集合做一个融合,然后调用whele扩展方法,传入限定条件,即可查询出符合条件的集合

void Start()
{
        //扩展方法查询:
        var result = fairyCutters.SelectMany(result1temp => artifacts,(result1temp, artifacts)=>new {result1= result1temp, result2= artifacts}).Where((resultTemp) => (int)resultTemp.result1.Stage>=3&&resultTemp.result1.ArtifactName==resultTemp.result2.ArtifactName&&resultTemp.result2.InjuryValue>80);
        foreach (var item in result)
        {
            Debug.Log(item);
        }
}

4.对查询的结果进行排序

Linq表达式的排序方式在3中已经介绍,扩展方法中的排序:

OrderBy()方法,参数同样是一个委托,OrderBy默认是从小到大排序

OrderByDescending()默认从大到小排序。

扩展方法的多参数排序,在调用OrderBy之后,再调用ThenBy()方法,意思就是再OrderBy排序中,排序条件相等的条件下,然后再通过ThenBy()中的条件进行排序,同样ThenBy()也有从大到小排序ThenByDescending()

void Start()
{  
var result = fairyCutters.SelectMany(fairyCuttersTemp => artifacts, (fairyCuttersTemp, artifacts) => new { result1 = fairyCuttersTemp, result2 = artifacts })
            .Where((resultTemp) => (int)resultTemp.result1.Stage >= 3 && 
             resultTemp.result1.ArtifactName == resultTemp.result2.ArtifactName && 
             resultTemp.result2.InjuryValue > 80)
            .OrderBy(tempValue=>tempValue.result1.Age);
        foreach (var item in result)
        {
            Debug.Log(item);
        }
}

未完待续。。。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# LINQ的基础使用方法 的相关文章

  • 【UGUI】2D头顶血条制作

    前言 近期因为需要制作玩家和敌人头顶的2D血条 查找了很多博客 发现很多都拘束于Canvas的渲染模式必须要设定为ScreenSpace Overlay 还有应该是版本原因 我的是unity2019 1 11f1 用RecttTransfo
  • Unity Animator 动画没切换

    恶魔射手 Survival Shooter 项目 有两个动画 一个是静止时的Idle 一个是走路时候的Move 如下图 设置好动画状态机后发现按方向键后还是Idle 没反应 而一直按着方向键后呢又动起来了 最后找到了真相 原来选中了 Has
  • 1.17 从0开始学习Unity游戏开发--场景切换

    前面的所有文章我们都在一个固定的游戏场景内进行开发 在最开始介绍场景这个概念的时候就已经提及 这个场景可以是一张地图 或者是一个对战房间等等 所以显然这个场景可以有多个 并且可以从一个场景切换到另外一个场景 那么在Unity中如何进行场景切
  • Unity 分块延迟渲染01 (TBDR)

    现代移动端图形体系结构的概述 现代SoC通常会同时集成CPU和GPU CPU被用于处理需要低内存延迟的序列 大量分支的数据集 其晶体管用于流控制和数据缓存 GPU为处理大型 未分支的数据集 如3D渲染 晶体管专用于寄存器和算术逻辑单元 而不
  • Unity中级客户端开发工程师的进阶之路

    上期UWA技能成长系统之 Unity高级客户端开发工程师的进阶之路 得到了很多Unity开发者的肯定 通过系统的学习 可以掌握游戏性能瓶颈定位的方法和常见的CPU GPU 内存相关的性能优化方法 UWA技能成长系统是UWA根据学员的职业发展
  • 字节对齐规则和位域

    字节对齐规则 结构体的起始存储位置必须是能够被该结构体中最大的数据类型所整除 每个数据成员存储的起始位置是自身大小的整数倍 比如int在32位机为4字节 则int型成员要从4的整数倍地址开始存储 结构体总大小 也就是sizeof的结果 必须
  • Unity3d 插件 系列——DoTweenPro介绍(图文详细+案例)

    Unity3d 插件 系列 DoTweenPro介绍 图文详细 案例 前言 一 DoTweenPro简介 二 DoTweenPro安装 三 DoTweenPro主要组件 1 DoTweenAnimation 2 DoTweenPath 3
  • Unity中UI框架的使用1-添加面板、显示Loading页面

    其中BasePanel和Canvas都是挂在面板的预制物上的 1 导入我们的UI框架 本篇文章中有用的是两个UIPanelType NUIManager和NBasePanel 会放在文章最后供大家使用 2 先将我们做好的Panel设置成预制
  • Unity之获取游戏物体对象或组件的几个方法

    文章目录 前言 通过物体名称获取对象 GameObject Find Transform Find 通过物体标签获取对象 GameObject FindWithTag GameObject FindGameObjectWithTag Gam
  • Unity 键盘控制人物移动——之输入方式代码的编写

    键盘输入 控制人物移动 在我们制作游戏中最常见的需求之一就是使用键盘移动游戏角色 那么我们首先需要获取键盘输入 以下提供两种方法获取键盘 这里尽量通过截图解释让大家理解代码的含义 GetInput void FixedUpdate Move
  • unity3d大型互动照片墙

    1 本次应客户需求 制作一个大型照片墙互动 输出分辨率为9600 4320 注 unity3d官方推荐最大分辨率为8192 3686 4 经过现场长达24小时暴力测试中途未发生问题 姑且判定可以达到正常标准 废话不多说 先上效果 unity
  • unity: C#的Action Event Delegate的异同

    目录 一 Action 二 Event 三 Action和Event区别 四 Delegate 总结 Action Event Delegate的异同 前言 Action Event和Delegate都是C 语言中的重要概念 分别用于管理函
  • unity实现鼠标右键控制视角

    主要实现的功能是相机跟随主角 鼠标右击移动后 相机的视角会旋转 思路 在主角里创建空的子物体 把相机绑在空物体上 通过旋转空物体来实现视角的旋转 要把相机调整到适当位置 代码如下 public float rotateSpeed 100 设
  • C++函数模板与类模板

    目录 C 模板定义 函数模板 类模板 类模板的定义 模板的优缺点 模板的优点 模板的缺点 C 模板定义 C 模板允许程序员在通用编程中创建可重用的代码 这种编程技术基于模板的编
  • 【转载】【Unity】WebSocket通信

    1 前言 Unity客户端常用的与服务器通信的方式有socket http webSocket 本文主要实现一个简单的WebSocket通信案例 包含客户端 服务器 实现了两端的通信以及客户端向服务器发送关闭连接请求的功能 实现上没有使用U
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • 游戏开发创建操作之玩家信息系统的建立

    游戏一般都需要玩家信息系统 那么我们应该如何搭建玩家信息系统 接下来我将展示一种简单的方法 完整代码如下 using System Collections using System Collections Generic using Uni
  • 游戏开发常见操作梳理之NPC药品商店系统(NGUI版)

    后续会出UGUI Json的版本 敬请期待 游戏开发中经常会出现药品商店 实际操作与武器商店类似 甚至根据实际情况可以简化设置 废话不多说 直接上代码 药品商店的源码 using System Collections using Syste
  • 游戏开发常用实践操作之按动任意键触发

    接下来一些笔记会对于一些大大小小的实践操作进行记录 希望对你有所帮助 在游戏中 我们经常会遇到一些按动任意键触发的操作 接下来展示核心代码 以下是对于Unity中的操作 使用的UI是NGUI 对于核心操作没有影响 你可以自己置换 void

随机推荐