---
title: "LINQ"
date: "2026-04"
category: "随笔"
tags: ["随笔"]
description: "这个有点意思，叫做「语言整合查询」（Language Integrated Query），可以在C#里用类似sql的查询方法，只要是枚举类都可以用这个..."
source: "https://enriquemark.com/zh-hans/posts/LINQ"
---

这个有点意思，叫做「语言整合查询」（Language Integrated Query），可以在C#里用类似sql的查询方法，只要是枚举类都可以用这个。

```csharp
/// 沒有 LINQ 的寫法
var result = new List<string>();
foreach (var f in files)
{
    if (f.Contains(keyword))
        result.Add(f);
}

/// 有 LINQ 的寫法
var result = files.Where(f => f.Contains(keyword)).ToList();
```

**常用方法：**

| 方法                         | 作用                                                       |
| -------------------------- | -------------------------------------------------------- |
| `.Where()`                 | 筛选（过滤条件）                                                 |
| `.Select()`                | 转换（这个就是map，对每个元素执行自定函数操作）                                |
| `.FirstOrDefault()`        | 取第一个，没有就返回 null                                          |
| `.Any()`                   | 有没有符合条件的元素                                               |
| `.Count()`                 | 计算数量                                                     |
| `.OrderBy()`               | 排序                                                       |
| `.ToList()` / `.ToArray()` | 具体化结果                                                    |
| `.ToHashSet()`             | 转为哈希Set（去重），元素可以给入去重规则<br>规则的类型需要是`IEqualityComparer<T>` |

然后这里的关键是，查询的描述跟最终的执行是分开的，所以必须用 `ToList()` 或者是 `ToArray()` 立即执行，亦或者是需要的时候再调这个去执行。

`List` 跟 `Array` 大部分情况下差不多，但最大的不同就是前者可以随时增减，而后者是固定的。如果是不会变动的场景，后者会比较合适，因为性能更高。而如果需要随时增减，那就得用前者了。
