关键字 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);
}
}
未完待续。。。