plugins/languages/csharp/skills/linq/SKILL.md
C# LINQ 查询与集合操作规范。覆盖 .NET 10 新操作符 (CountBy/AggregateBy/Index)、 方法链 vs 查询语法、延迟执行陷阱、EF Core 查询转换、Span<T> 高性能替代、 ToList/ToArray 时机、可枚举二次遍历、HashSet/DistinctBy。当编写数据查询、 集合处理、序列操作、优化 LINQ 性能, 或说 "LINQ"、"Where Select"、"GroupBy"、 "查询性能"、"IEnumerable"、"PLINQ"、"DistinctBy" 时加载。
npx skillsauth add lazygophers/ccplugin csharp-linqInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
LINQ 让代码声明式, 但用错会带来性能与正确性陷阱。
Where 可写在一行user、order, 避免单字母 xvar top = orders
.Where(o => o.Status == OrderStatus.Paid)
.GroupBy(o => o.CustomerId)
.Select(g => new { CustomerId = g.Key, Total = g.Sum(o => o.Amount) })
.OrderByDescending(x => x.Total)
.Take(10)
.ToList();
List<T> / T[]TryGetNonEnumeratedCount(out var n) 判数量不强求枚举// ❌ 每次遍历都重新查 DB
var q = db.Users.Where(u => u.Active);
foreach (var u in q) Log(u);
foreach (var u in q) Save(u);
// ✅
var users = await db.Users.Where(u => u.Active).ToListAsync(ct);
| 操作符 | 取代 |
|--------|------|
| CountBy(keySelector) | GroupBy(...).Select(g => new { g.Key, Count = g.Count() }) |
| AggregateBy(key, seed, agg) | 手写 GroupBy + Aggregate |
| Index() | Select((item, i) => (i, item)) |
| Chunk(n) | 手写批分 |
| DistinctBy(k) / UnionBy / ExceptBy / IntersectBy | 自定义 IEqualityComparer |
| MinBy / MaxBy | OrderBy(k).First() |
var hotTags = posts.CountBy(p => p.Tag).OrderByDescending(kv => kv.Value).Take(5);
Any() 优于 Count() > 0Count(predicate) 优于 Where(p).Count()FirstOrDefault(predicate) 合并谓词List 时 for 略快, 但优先可读ToList; 只在终点物化Contains 用 HashSet<T>, 避免 O(n²)Span<T> / ReadOnlySpan<T> 取代 LINQ on small arrays.AsParallel().WithDegreeOfParallelism(n)// 热路径: 单次扫描, 零分配
public int SumPositive(ReadOnlySpan<int> data)
{
var sum = 0;
foreach (var x in data) if (x > 0) sum += x;
return sum;
}
AsEnumerable 后)AsNoTracking() 读取无需跟踪的数据Include / ThenInclude / AsSplitQuerySelect(u => new UserDto(u.Id, u.Name))AsAsyncEnumerable() + 流式消费var page = await db.Orders.AsNoTracking()
.Where(o => o.CustomerId == cid)
.OrderByDescending(o => o.CreatedAt)
.Skip(skip).Take(pageSize)
.Select(o => new OrderListDto(o.Id, o.Amount, o.CreatedAt))
.ToListAsync(ct);
EF Core: ToListAsync/FirstOrDefaultAsync/AnyAsync/CountAsync, 全部接受 CancellationToken。
对 IAsyncEnumerable<T> 使用 System.Linq.Async 提供的异步 LINQ 操作。
| 反模式 | 修复 |
|--------|------|
| list.Count() > 0 | list.Any() 或 list.Count > 0 (ICollection) |
| list.OrderBy(k).First() | list.MinBy(k) |
| list.Where(p).Count() | list.Count(p) |
| list.Select(...).Where(...) | 调换: 先 Where 后 Select |
| Distinct() 自定义对象 | 实现 IEquatable<T> 或 DistinctBy(key) |
| 链中 ToList().Where(...) | 删除中段 ToList |
| 大集合 list.Contains(x) | HashSet<T> |
record / ImmutableArray<T>with 表达式产生记录副本tools
UI/UX 与布局设计——做界面布局/结构/导航/组件/交互的设计决策。触发:做UI/UX/布局/排版/导航/组件/交互/栅格/响应式/图表选型/字体配对。按媒介路由 HTML/Web、原生 App(iOS/Android/桌面)、CLI、TUI。需后端动态系统不适用;配色/主题/色板走姊妹 skill design-color。
tools
主题与配色设计——做颜色搭配/调色板/主题/品牌色阶/暗模式的设计决策。触发:选配色/调色/主题/色板/品牌色/暗模式/对比度/色盲/UI风格。按媒介路由 HTML/Web(CSS变量)、原生App(平台token)、CLI(ANSI)、TUI(真彩/256/16降级)。保证可访问性(对比度/色盲安全)。需后端动态系统不适用;UI/UX 布局/组件/交互走姊妹 skill design-uiux。
tools
跨任意组件(plugin/skill/agent/command)的验证驱动优化循环纪律 skill。当用户要优化某个已有组件却无明确方向、或要防止改了反而更差(自评乐观偏差 / 多维同改归因失效 / 为凑分加废话膨胀)、或要把一套通用「评分→单变量改→改后验证严格更好才留否则回滚→触顶停」的纪律套到任意组件上时使用。管优化过程本身的纪律(validation gate / ratchet / 独立验证 / 触顶停),不评单组件深度(交 skill-dev),不查插件接线(交 plugin-dev)。仅手动 /optimize-any 触发。
data-ai
两层规则记忆 (基于 .skein/spec)。planning 时 recall 召回相关规则、task finish 后 sediment 沉淀学习 + prune 自动精简过期/重复/断链规则。core 常驻硬规 + recall 按需召回, 经判定门自动写盘 (不逐次问用户)。产出 .skein/spec 下 core/recall 规则文件 + index。另支持空仓 bootstrap 播种规则基线、记忆大面积失效 (大重构/换栈) 时 reconstruct 可逆归档后按项目类型分型重建、maintain 手动体检 (超预算/stale/断链/重复/废弃, --apply 自动修复)、auto-fix (Stop hook 写 .pending-fix 标记 → main 派 skein-specer bg 跑 maintain --apply 全自动修, 断链只报告)。