/****************************************************
功能:继续学习linq语法
*****************************************************/
using System.Collections.Generic;
using System.Data;
using System.Linq;
using UnityEngine;
public class MoreLinqTest : 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
#region 用来测试连接运算的第二个表
public struct Sex
{
public string name;
public bool isMen;
public Sex(string _name = "", bool _isMen = true)
{
name = _name;
isMen = _isMen;
}
public override string ToString()
{
return $"name={name},_isMen={isMen}";
}
}
#endregion
#region 第二个表数据初始值
List<Sex> sexs = new List<Sex>()
{
new Sex(),
new Sex("小明",true),
new Sex("小红",false),
new Sex("小熊",true),
new Sex("马云",true),
new Sex("小暗",false),
};
#endregion
private void Start()
{
//TestGroupBy();
//TryFunLinq();
//TryFunLinq2();
//TestLinqIn();
TestJoin();
}
//用groupby进行分组
//语法:grup [源] by [条件] into [结果]
void TestGroupBy()
{
var res =
from a in students
//group a by a.age into n //这样会根据值不同分组
group a by a.age > 20 into n //这样会根据是否符合分成真假量组
select n;
foreach (var item in res)
{
string outRes = "key=" + item.Key.ToString();
foreach (var one in item)
{
outRes += "\n" + one;
}
Debug.Log(outRes);
}
}
//in语法
void TestLinqIn()
{
var res =
from a in students
where (new int[] { 40, 21 }).Contains(a.age)
select a;
ShowAns(res);
}
//join语法
//还有使用select选择多个字段的方法
void TestJoin()
{
var res1 =
from a in students
join b in sexs
on a.name equals b.name
select new //选择多个字段
{
a.name,
a.age,
b.isMen,
};
res1.ToList().ForEach(item =>
Debug.Log(item) //查询结果是一个神奇的匿名类型
);
}
//尝试函数式的linq语法。简单使用。
void TryFunLinq()
{
var res1 =
students.Where(p => p.age > 20);
ShowAns(res1);
//Debug.Log(students.Select(p => p).Count());
}
//尝试函数式的linq语法。更多方法。
void TryFunLinq2()
{
//每次运行一行,其他的注释
var res2 =
//students.Select(p => p.age);
//students.OrderBy(p => p.age).Select(p => p.age);
students.OrderByDescending(p => p.age).Select(p => p.age);
res2.ToList().ForEach(p => Debug.Log($"结果为:{p}"));
}
}