C# LINQ的基础使用方法

关键字  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);
        }
}

未完待续。。。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值