优秀的编程知识分享平台

网站首页 > 技术文章 正文

C# LINQ 详解 From Where Select OrderBy Group Into Let Join

nanyue 2024-08-09 07:07:28 技术文章 13 ℃

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



Tags:

最近发表
标签列表