会用两种写法了,第一种,firstordefault里面,直接写想要的
例:
第二种,where里面,需要return true/false
概念如下
凡是实现了IEnumerable接口的都可以用Linq语句进行查询
Linq: Language Intergrated Query 语言集成查询
在这之前,都是一个查询字符串,传递给动态库进行解析查询
IEnumerable
LINQ to SQL / XML / DataSet / Objects
Where方法
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
1.where函数后面声明了将要使用的泛型<TSource>,返回值是该泛型的集合的迭代器;
2.xxx.Where 自动传入this迭代器参数,扩展方法
3.Func<TSource, bool> predicate 是内部嵌套使用的泛型代理方法,作为参数传递
3.1.public delegate TResult Func<T, TResult>(T arg);
3.2.该方法在此处,需要传入一个 Where中 TSource类型,返回bool型
其他方法
其他方法与Where方法大同小异,都在System.Linq命名空间下的Enumerable类中。
1.最简单的数组进行Linq查询
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
namespace LinqTest
{
class Program
{
static void Main(string[] args)
{
//Linq: Language Intergrated Query 语言集成查询
//在这之前,都是一个查询字符串,传递给动态库进行解析查询
//IEnumerable
//LINQ to SQL/XML/DataSet/Objects
int[] numbers = { 5, 10, 8, 3, 6, 12 };
//1.Query syntax
var numQuery1 = from num in numbers
where num % 2 == 0
orderby num
select num;
foreach(var x in numQuery1)
{
Console.WriteLine(x);
}
Console.ReadLine();
//2.Method syntax
var numQuery2 = numbers.Where((x) => { return (x % 2) == 0; }).OrderBy(x => x);
foreach (var x in numQuery1)
{
Console.WriteLine(x);
}
Console.ReadLine();
}
}
}
2.以下四个方法,达到效果相同。虽然,到现在还是没弄懂selectwhere这个复杂的泛型的结构,但是能用了;效果是,把两个list投影到一个list进行查找(据说Linq的效率还很高)。那么以后查找不遍历了,使用linq。
public class Item
{
public int ID;
public string name;
}
List<List<Item>> AllList = new List<List<Item>>();
public Item GetItem0(int id)
{
foreach (var x in AllList)
{
foreach (var y in x)
{
if (y.ID == id) return y;
}
}
return null;
}
public Item GetItemByID0(int id) => AllList.SelectMany(c => c).FirstOrDefault(c => c.ID == id);
public Item GetItemByID1(int id)
{
return AllList.SelectMany(c => c).FirstOrDefault(c => c.ID == id);
}
public Item GetItemByID2(int id)
{
return AllList.SelectMany(c => c).Where(c => c.ID == id).First();
}