初学 C# 时,处理集合往往是先写 foreach 循环,再一层层 if 判断。其实 C# 内置了一套更优雅的工具——LINQ(Language Integrated Query,语言集成查询),它让你用接近自然语言的方式对集合进行筛选、排序和变换,代码更短、更好读。这篇带你入门最常用的几个 LINQ 方法。

准备工作

LINQ 的核心方法都在 System.Linq 命名空间里,使用前先引入:

using System;
using System.Collections.Generic;
using System.Linq;

var scores = new List<int> { 55, 92, 78, 61, 88, 40 };

后面的例子都基于这个 scores 集合演示。

Where:筛选符合条件的元素

Where 相当于"过滤器",传入一个返回 bool 的条件,满足条件的元素会被保留:

var passed = scores.Where(s => s >= 60);

foreach (var s in passed)
{
    Console.WriteLine(s);
}
// 输出:92、78、61、88

s => s >= 60 是 Lambda 表达式,意思是"对每个元素 s,判断它是否大于等于 60"。

OrderBy:排序

OrderBy 升序,OrderByDescending 降序:

var sorted = scores.OrderByDescending(s => s);

Console.WriteLine(string.Join(", ", sorted));
// 输出:92, 88, 78, 61, 55, 40

Select:把元素变换成另一种形式

Select 会对每个元素做一次"映射",常用于提取字段或转换格式:

var names = new List<string> { "Tom", "Jerry", "Spike" };

var upper = names.Select(n => n.ToUpper());

Console.WriteLine(string.Join(", ", upper));
// 输出:TOM, JERRY, SPIKE

链式调用:LINQ 最强大的用法

这些方法可以像链条一样串起来。比如"找出及格的分数,降序排列,取前三个":

var top3 = scores
    .Where(s => s >= 60)
    .OrderByDescending(s => s)
    .Take(3);

Console.WriteLine(string.Join(", ", top3));
// 输出:92, 88, 78

还有几个高频方法值得记住:

  • First() 取第一个元素,没有则抛异常;FirstOrDefault() 找不到时返回默认值
  • Count(...) 统计满足条件的个数
  • Any(...) 判断是否存在满足条件的元素
  • Sum() / Average() / Max() / Min() 做聚合计算
Console.WriteLine(scores.Count(s => s >= 60)); // 输出:4
Console.WriteLine(scores.Max());               // 输出:92
Console.WriteLine(scores.Average());           // 输出:69

小结

LINQ 把常见的集合操作变成了声明式的链式调用:Where 筛选、OrderBy 排序、Select 变换,配合 Take、Count、Max 等方法能覆盖绝大多数日常场景。它代码短、意图清晰,还省去了手写循环时的边界烦恼。下次处理 List 时,先想想能不能用一条 LINQ 链代替循环——练熟之后,处理集合的效率会有质的提升。