LINQ擴充套件方法

小脑虎爱学习發表於2024-07-06

餘生只想牽你的手從天光乍破走到暮雪白頭。 --zhu
常用LINQ控制方法
大部分是IEnumerable 的擴充套件方法(陣列,List,Dictionary,set)
(1)Where

static void Main(string[] args)
{
  List<Employee> list = new List<Employee>();
  list.Add(new Employee {Id=1,Name = "jerry",Age= 26,Gender= true,Salary = 5000});
  list.Add(new Employee {Id=2,Name = "jim",Age= 33,Gender= true,Salary = 3000});
  list.Add(new Employee {Id=3,Name = "Lily",Age= 16,Gender= true,Salary = 
  9000});
  list.Add(new Employee {Id=4,Name = "luck",Age= 26,Gender= true,Salary = 2000});
  list.Add(new Employee {Id=5,Name = "kimi",Age= 35,Gender= true,Salary = 8000});
  list.Add(new Employee {Id=6,Name = "jack",Age= 33,Gender= true,Salary = 6000});

  IEnumber<Employee> items1 =  list.Where(e  => e.Age > 30);
  foreach(Employee e in items)
  {
    Console.WriteLine(e);
  }
  Console.WriteLine(list.Count());
  Console.WriteLine(list.Count(e  => e.Age > 30));
}

(2)Count
獲取資料條數
(3)Any
是否至少有一條資料,有可能比Count()實現效率高

bool b1 list.Any(e=>e.Salery>8000);
bool b2 =list.Where(e=>e.Salery>8000).Any();

(4)獲取一條資料(是否帶引數的兩種寫法):
Single:有且只有一條滿足要求的資料;
SingleOrDefault:最多隻有一條滿足要求的資料;
First:至少有一條,返回第一條;
FirstOrDefault:返回第一條或者預設值;
選擇合適的方法,“防禦性程式設計”

(5)排序
Order()對資料正序排序;
OrderByDescending()倒序排序;
list.OrderBy(e=>e.Age);
對於簡單型別排序,也許不用lambda表示式。特殊案例:按照最後一個字串排序;使用Guid或者隨機數進行隨機排序。

IEnumerable<Employee> items=list.OrderBy(e=>e.Age);
foreach(Employee e in items)
{
  Console.WriteLine(e);
}

(6)多規則排序
可以在Order().OrderByDescending()後繼續寫ThenBy(),ThenByDescending()。
案例:優先按照Age排序,如果Age相同再按照Salary排序。
list.OrderBy(e=>e.Age).ThenByDescending(e.=>e.Salary)
千萬不要寫成list.OrderBy(e=>e.Age).OrderByDescending(e.=>e.Salary)

(7)限制結果集,獲取部分資料:
Skip(n)跳過n條資料,Take(n)獲取n條資料。
案例:獲取從第2條開始獲取3條資料
var orderedItems1=list.Skip(2).Take(3);
Skip(),Take()也可以單獨使用。

(8)聚合函式:
Max(),Min(),Average(),Sum(),Count()。
LINQ 中所有的擴充套件方法幾乎都是針對IEnumerable介面的,而幾乎所有能返回集合的都返回IEnumerable,所以是可以把幾乎所有方法“鏈式使用”的。
list.Where(e=>e.Age>30).Min(e=>e.Salary)

(9)分組
GroupBy()方法引數是分組條件表示式,返回值為IGrouping<TKey,TSourse>型別的泛型IEnumerable,也就是每一組以一個IGrouping物件的形式返回。IGrouping是一個繼承自IEnumerable的介面,IGrouping中屬性表示這一組的分組資料的值。
例子:根據年齡分組,獲取每組人數,最高工資,平均工資。用var簡化程式設計。

IEnumerable<IGrouping<int,Employee>> items =list.GroupBy(e=>e,Age);
foreach(IGrouping<int,Employee> g in items)
{
  console.WriteLine(g.Key);
  foreach(Emploee e in g)
  {
    Console.WriteLine(e);
  }
   Console.WriteLine("****************");
}

(10)投影
把集合中的每一項轉換為另外一種型別。

IEnumerable<int> ages = list.Select(e=>e.Age);
Ienumerable<string> names=list.Select(e=>e.Gender?"男":"女");
var dogs=list.Select(p=>new Dog{NickName=e.Name,Age=e.Age});

匿名型別:
var p=new {Name="tom",Id=1};
var p1=new {name,Id=1,p.Age};

(11)集合轉換
有一些地方需要陣列型別或者List型別的變數,我們可以用ToArray()方法和ToList()分別把IEnumerable轉換為陣列型別和List型別。

IEnumerable<Employee> items1=list.Where(e=>e.Salary>6000);
List<Employee> list2=items1.ToList();
Employee[] array2=items1.ToArray();

(12)where,select,OrderBy,GroupBy,Take,Skip等返回值都是IEnumerable型別,所以可以鏈式呼叫。例子:
獲取Id>2的資料,然後按照Age分組,並且把分組按照Age排序,然後取出前三條,最後再投影取得年齡,人數,平均薪資。

list.Where(e=>e.Id>2).GroupBy(e=>e.Age).OrderBy(g=>g.Key).Take(3)
.Select(g=>new {NL=g.Key,RS=g.Count(),PJ=g.Average(e=>e.Salary)})

(13)查詢語法
使用Where,OrderBy,Select等擴充套件方法進行資料查詢的寫法叫做“LINQ方法語法”。還有一種“查詢語法”的寫法

var items=from e in list
  where e.Salary>3000
  orderby e.Age
  select new {e.Name,e.Age,Gender=e.Gender?"男":"女"};

相關文章