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的基础使用方法 的相关文章

  • Unity3D之Rigidbody

    目录 常用的Rigidbody属性和方法 rigidbody AddForce rigidbody AddTorque rigidbody velocity rigidbody angularVelocity rigidbody Sleep
  • using UnityEditor引用注意事项

    本文转载自http blog csdn net czlilove article details 19979725 在运行时脚本中使用UnityEditor命名空间 假如该脚本被挂在场景中的物体上 那么 可以这样做 在Unity编辑器中运行
  • UE5学习笔记(一)——界面功能梳理&第一天知识点记录

    学习UE5的第一步 是软件安装 默认是安装好的 由于安装没有太多技术含量 所以就没有专门做记录 这里有个注意点 虚幻引擎是整合在Epic games launcher中的 也就是说开发引擎内嵌在游戏平台上 打个比方 就是如果你要下unity
  • 蒙特卡洛积分、重要性采样、低差异序列

    渲染公式 渲染的目标在于计算周围环境的光线有多少从表面像素点反射到相机视口中 要计算总的反射光 每个入射方向的贡献 必须将他们在半球上相加 为入射光线 与法线 的夹角 为方便计算可以使用法线向量和入射向量 单位化 的乘积表示 对于基于图像的
  • 【Unity&C#&随机数】随机数

    一个简单的随机数获得 0或1 使用了这样的代码 想要获得0或者1 if Input anyKeyDown float i 1 if i 1 i Random Range 0 Rang i i lt 0 5 0 1 Debug Log Cou
  • unity网络资源导入

    1 找到需要导入的文件 这里导入fbx格式 2 打开unity界面 在Asset目录下创建文件夹FBX 将需要导入的fbx预制体或整个文件夹拖入创建的FBX文件夹下 3 选中需要的fbx预制体并拖至场景中 4 双击定位到当前物体 5 找到需
  • 1.17 从0开始学习Unity游戏开发--场景切换

    前面的所有文章我们都在一个固定的游戏场景内进行开发 在最开始介绍场景这个概念的时候就已经提及 这个场景可以是一张地图 或者是一个对战房间等等 所以显然这个场景可以有多个 并且可以从一个场景切换到另外一个场景 那么在Unity中如何进行场景切
  • Lambda表达式、std::function、和std::bind函数

    Lambda表达式 std function 和std bind函数 Lambda表达式 capture parameters mutable exception gt return type statement 1 capture 捕获外
  • C/C++创建和删除文件夹操作

    一 创建文件夹 1 调用Windows API函数 CreateDirectory 头文件
  • Unity与Android的Back键冲突解决

    Unity与Android的Back键冲突解决 上一篇的最后留下了两个问题 Unity视图下横屏闪退 Unity视图下Android无法响应back返回上一activity 对于第一个问题 应该是Unity横屏下视图的某些设置跟Androi
  • 【IMGUI】 各种辅助类 EditorGUIUtility、EditorUtility、GUIUtility、GUILayoutUtility

    EditorGUIUtility class in Editor 继承自 GUIUtility EditorGUI 的各种辅助程序 EditorGUIUtility currentViewWidth 我尝试打印了下这个值和position
  • unity 性能查看工具Profiler

    文章目录 前言 profiler工具介绍 菜单栏 帧视图 模块视图 模块详细信息 通过profiler分析优化游戏性能 最后 前言 每次进行游戏优化的时候都用这个工具查看内存泄漏啊 代码优化啊之类的东西 真的好用 但是之前也就是自己摸索一下
  • 【Unity步步升】监控与检测物体的各种方案,如:射线、碰撞、挂载等...

    在制作AR模型数值控制方案的时候遇到了检测的问题 学习过程受益匪浅 故今天为大家整理带来一篇监控与检测物体的参考方案集合 目录 一 射线检测 二 物体存在检测 三 碰撞检测 一 射线检测 单射线检测 首先完成搭建场景如下图1 1 我这里用到
  • C++函数模板与类模板

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

    1 前言 Unity客户端常用的与服务器通信的方式有socket http webSocket 本文主要实现一个简单的WebSocket通信案例 包含客户端 服务器 实现了两端的通信以及客户端向服务器发送关闭连接请求的功能 实现上没有使用U
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • U3D游戏开发中摇杆的制作(UGUI版)

    在PC端模拟摇杆 实现玩家通过控制摇杆让玩家移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine using Unity
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发常见操作系列之敌人系统的开发一(U3D)

    在开发游戏的过程中 我们常常会出现一些敌人攻击我们玩家 并且实现掉血以及死亡的现象 敌人还会源源不断地生成 这是怎么制作的呢 接下来为大家提供方法 其中使用了NGUI 后续会更新其它方法 敬请期待 使用HUDText实现扣血时显示文本 直接
  • 游戏开发中常见系统梳理之背包系统的实现一

    游戏中几乎都存在大大小小的背包系统 接下来我将讲述背包系统具体是如何实现的 完整源码 以下是使用unity NGUI实现 使用txt配置的方法 后续更新UGUI Json实现的背包系统敬请期待 背包中的物品我们常常将其制作成预设体 通过改变

随机推荐