Linq 要求
- Linq的数据源要求必须实现IEnumerable或IEnumerable<T>接口,数组隐式支持这个接口。
- Linq表达式必须要以from子句开头
- Linq表达式必须以select或group子句结束
from where select
从list中遍历s,条件s的年龄大于12选择出所有s。
List<Person> list = new List<Person>();
list.Add(new Person { name="ab", age=12});
list.Add(new Person { name="ac", age=26});
list.Add(new Person { name="bb", age=12});
list.Add(new Person { name="bc", age=12});
var result = from s in list where s.age > 12 select s;
foreach (Person p in result) {
Debug.Log(#34;姓名:{p.name} 年龄:{p.age}");
}
结果:
姓名:ac 年龄:26
多条件(从list中遍历s,条件s的年龄等于12并且名字包含字母a 选择出所有s。)
List<Person> list = new List<Person>();
list.Add(new Person { name="ab", age=12});
list.Add(new Person { name="ac", age=26});
list.Add(new Person { name="bb", age=12});
list.Add(new Person { name="bc", age=12});
var result = from s in list where (s.age == 12 && s.name.Contains("a")) select s;
foreach (Person p in result) {
Debug.Log(#34;姓名:{p.name} 年龄:{p.age}");
}
结果:
姓名:ab 年龄:12
select 对结果投影 即返回的结果可以是其它数据集合。如下代码由Person转成string集合返回。还可以new其它对象返回。
List<Person> list = new List<Person>();
list.Add(new Person { name="ab", age=12});
list.Add(new Person { name="ac", age=26});
list.Add(new Person { name="bb", age=12});
list.Add(new Person { name="bc", age=12});
var result = from s in list where (s.age == 12) select s.name;
foreach (string name in result) {
Debug.Log(#34;姓名:{name}");
}
结果:
姓名:ab
姓名:bb
姓名:bc
from where orderby select
从list中遍历s,条件s的年龄大于10,然后以age升序,age相同以name降序排序 选择出所有s
orderby 是升序,descending是降序。排序多条件中间逗号分隔。
List<Person> list = new List<Person>();
list.Add(new Person { name="ab", age=12});
list.Add(new Person { name="ac", age=26});
list.Add(new Person { name="bb", age=12});
list.Add(new Person { name="bc", age=12});
var result = from s in list where s.age > 10 orderby s.age, s.name descending select s;
foreach (Person p in result) {
Debug.Log(#34;姓名:{p.name} 年龄:{p.age}");
}
结果:
姓名:bc 年龄:12
姓名:bb 年龄:12
姓名:ab 年龄:12
姓名:ac 年龄:26
from group
以年龄相同的分组
List<Person> list = new List<Person>();
list.Add(new Person { name="ab", age=12});
list.Add(new Person { name="ac", age=26});
list.Add(new Person { name="bb", age=12});
list.Add(new Person { name="bc", age=12});
var result = from s in list group s by s.age;
foreach (IGrouping<int, Person> group in result) {
Debug.Log(#34;分组:{group.Key}");
foreach (Person p in group) {
Debug.Log(#34; 姓名:{p.name} 年龄:{p.age}");
}
}
结果:
分组:12
姓名:ab 年龄:12
姓名:bb 年龄:12
姓名:bc 年龄:12
分组:26
姓名:ac 年龄:26
from group into
into子句作为一个临时标识符,用于select,group,join子句中。
List<Person> list = new List<Person>();
list.Add(new Person { name="ab", age=12});
list.Add(new Person { name="ac", age=26});
list.Add(new Person { name="bb", age=12});
list.Add(new Person { name="bc", age=12});
var result = from s in list group s by s.age into arr orderby arr.Key descending select arr;
foreach (IGrouping<int, Person> group in result) {
Debug.Log(#34;分组:{group.Key}");
foreach (Person p in group) {
Debug.Log(#34; 姓名:{p.name} 年龄:{p.age}");
}
}
结果:
分组:26
姓名:ac 年龄:26
分组:12
姓名:ab 年龄:12
姓名:bb 年龄:12
姓名:bc 年龄:12
from let where select
let 作为一个临时变量存储结果
List<Person> list = new List<Person>();
list.Add(new Person { name="ab", age=12});
list.Add(new Person { name="ac", age=26});
list.Add(new Person { name="bb", age=12});
list.Add(new Person { name="bc", age=12});
var result = from s in list let x = s.name where x.Contains("a") select s;
foreach (Person p in result) {
Debug.Log(#34;姓名:{p.name} 年龄:{p.age}");
}
结果:
姓名:ab 年龄:12
姓名:ac 年龄:26