/****************************************************
功能:学习基本linq语句
直接复制到代码文件里即可食用
每次请只执行start里一个方法,其他注释掉
推荐把方法折叠起来看
只有前8个。
*****************************************************/
using System;
using System.Linq;
using System.Collections.Generic;
using UnityEngine;
public class TestLinq : MonoBehaviour
{
#region 数据定义
public struct Student
{
public string name;
public int age;
public float score;
public Student(string _name = "", int _age = 20, float _score = 60f)
{
name = _name;
age = _age;
score = _score;
}
public override string ToString()
{
return $"name={name},age={age},score={score}";
}
}
//用来输出查询结果
void ShowAns(IEnumerable<Student> value)
{
foreach (var item in value)
{
Debug.Log($"查询结果为:{item}");
}
}
#endregion
#region 数据初始值
List<Student> students = new List<Student>()
{
new Student(),
new Student("小明",21,100f),
new Student("小红",19,90f),
new Student("小熊",18,120f),
new Student("马云",40,150f),
new Student("小暗",21,80f),
};
#endregion
/*
* 学习资料来源:https://www.cnblogs.com/sxjljj/p/11348652.html
* 但是内容不一样哦,把这个直接粘贴到代码里就能用
*
* linq是一种可以在c#中直接以数据库语言进行查询的方法。
* 可操作各种容器如list等,
* 可简化一些条件查询操作
* linq甚至可以操作数据库,
* 比原始的字符串指令式数据库操作相比,
* 可以进行关键字检查,可读性强,不易出错
*
* 常见关键字如下
* from子句:指定查询操作的数据源和范围变量
* where子句:筛选元素的逻辑条件,返回值是一个bool类型
* select子句:指定查询结果的类型和表现形式
* orderby子句:对查询结果进行排序(升序或者降序)
* group子句:对查询结果进行分组
* into子句:提供一个临时标识符,
* 该表示可充当对join/group/select子句结果的引用
* join子句:连接多个查询操作的数据源
* let子句:引入用于存储查询表达式中的子表达式结果的范围变量
*
* 简单的函数计算
* count
* min
* max
* sum
*/
private void Start()
{
//FirstLinq();
//TestWhere();
//TestFunc();
//TestOrder();
//TestOrder2();
//TestPage();
TestLike();
}
//基本查询。
void FirstLinq()
{
//必须以from开始,以select 或group by结尾
var res =
from a in students
select a;
ShowAns(res);
}
//使用where的筛选。
void TestWhere()
{
//where可以使用各种表达式。
//可以接多个where
var res =
from a in students
//where a.age == 21f || a.age == 19f
//where a.age > 20
where a.age % 2 == 0
where a.age != 0
select a;
ShowAns(res);
}
//使用基本查询函数
void TestFunc()
{
var res =
from a in students
select a.age;
Debug.Log($"max={(res).Max()}");
Debug.Log($"min={(res).Min()}");
Debug.Log($"max={(res).Count()}");
Debug.Log($"max={(res).Sum()}");
}
//测试排序
void TestOrder()
{
//排序可多次使用,
//实现主排序关键字相同时,
//继续用次要关键字排序
var res =
from a in students
orderby a.score
orderby a.age
select a;
ShowAns(res);
}
//正序和倒序排序
void TestOrder2()
{
//排序可多次使用,可指定正序倒序
var res =
from a in students
//orderby a.age descending//倒序排序
orderby a.age ascending//正序排序
select a;
ShowAns(res);
}
//查某一段数据(分页)
void TestPage()
{
var res =
from a in students
select a;
//这个函数类似sql中top
Debug.Log("top=" + res.FirstOrDefault());
Debug.Log("跳过两条数据的结果");
//跳过前2条数据
ShowAns(res.Skip(2));
Debug.Log("查2-4的数据");
ShowAns(res.Skip(2).Take(2));
}
//使用Contains实现sql中的like操作
//注意此处需要做空异常检测!
//https://www.cnblogs.com/zhaofangyan/p/10154637.html
void TestLike()
{
var res =
from a in students
where a.name != null && a.name.Contains("小")
select a;
ShowAns(res);
//Debug.Log("".Contains(""));
}
}