跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C Sharp LINQ 过滤
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C# LINQ 过滤 = '''LINQ(Language Integrated Query)'''是C#中用于查询数据的强大工具,而'''过滤'''是LINQ中最常用的操作之一。通过过滤,可以从数据集合中筛选出符合特定条件的元素。本教程将详细介绍LINQ过滤的概念、语法、实际应用以及相关技巧。 == 介绍 == LINQ过滤操作允许开发者使用简洁的语法从数据源(如数组、集合、数据库等)中提取满足特定条件的元素。最常见的过滤方法是使用'''Where'''子句,它接受一个谓词(返回布尔值的函数)作为参数,并返回所有满足该谓词的元素。 LINQ过滤可以应用于任何实现了'''IEnumerable<T>'''或'''IQueryable<T>'''接口的数据源,包括: * 内存中的集合(如List、Array) * 数据库(通过Entity Framework) * XML文档 * 其他自定义数据源 == 基本语法 == LINQ提供两种语法形式来执行过滤操作:'''查询语法'''和'''方法语法'''。 === 查询语法 === 查询语法类似于SQL,使用`where`关键字进行过滤: <syntaxhighlight lang="csharp"> from item in collection where condition select item; </syntaxhighlight> === 方法语法 === 方法语法使用扩展方法,主要通过`Where()`方法: <syntaxhighlight lang="csharp"> collection.Where(item => condition); </syntaxhighlight> 两种语法在功能上是等价的,编译器会将查询语法转换为方法语法。 == 代码示例 == === 示例1:基本过滤 === 以下示例演示如何从一个整数列表中筛选出偶数: <syntaxhighlight lang="csharp"> List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // 查询语法 var evenNumbersQuery = from num in numbers where num % 2 == 0 select num; // 方法语法 var evenNumbersMethod = numbers.Where(num => num % 2 == 0); // 输出结果 Console.WriteLine("偶数:"); foreach (var num in evenNumbersMethod) { Console.WriteLine(num); } </syntaxhighlight> '''输出:''' <pre> 偶数: 2 4 6 8 10 </pre> === 示例2:复杂条件过滤 === 可以组合多个条件进行更复杂的过滤: <syntaxhighlight lang="csharp"> List<string> fruits = new List<string> { "Apple", "Banana", "Cherry", "Date", "Elderberry", "Fig", "Grape" }; // 长度大于3且包含字母'a'的水果 var filteredFruits = fruits.Where(f => f.Length > 3 && f.ToLower().Contains('a')); foreach (var fruit in filteredFruits) { Console.WriteLine(fruit); } </syntaxhighlight> '''输出:''' <pre> Banana Cherry Elderberry Grape </pre> == 实际应用案例 == === 案例1:电子商务产品过滤 === 假设有一个电子商务网站,需要根据用户选择的条件过滤产品: <syntaxhighlight lang="csharp"> public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } public string Category { get; set; } public int Stock { get; set; } } List<Product> products = new List<Product> { new Product { Id = 1, Name = "Laptop", Price = 999.99m, Category = "Electronics", Stock = 10 }, new Product { Id = 2, Name = "Smartphone", Price = 699.99m, Category = "Electronics", Stock = 15 }, new Product { Id = 3, Name = "Desk Chair", Price = 199.99m, Category = "Furniture", Stock = 5 }, new Product { Id = 4, Name = "Coffee Mug", Price = 9.99m, Category = "Kitchen", Stock = 20 } }; // 用户过滤条件 decimal maxPrice = 500.00m; string desiredCategory = "Electronics"; int minStock = 5; var filteredProducts = products.Where(p => p.Price <= maxPrice && p.Category == desiredCategory && p.Stock >= minStock); Console.WriteLine("符合条件的商品:"); foreach (var product in filteredProducts) { Console.WriteLine($"{product.Name} - ${product.Price}"); } </syntaxhighlight> '''输出:''' <pre> 符合条件的商品: Smartphone - $699.99 </pre> === 案例2:日志文件分析 === 从日志条目中筛选出特定级别的错误: <syntaxhighlight lang="csharp"> public class LogEntry { public DateTime Timestamp { get; set; } public string Level { get; set; } public string Message { get; set; } } List<LogEntry> logs = new List<LogEntry> { new LogEntry { Timestamp = DateTime.Now.AddHours(-1), Level = "INFO", Message = "System started" }, new LogEntry { Timestamp = DateTime.Now.AddMinutes(-30), Level = "WARNING", Message = "Disk space low" }, new LogEntry { Timestamp = DateTime.Now.AddMinutes(-5), Level = "ERROR", Message = "Database connection failed" } }; // 只显示ERROR级别的日志 var errorLogs = logs.Where(log => log.Level == "ERROR"); foreach (var log in errorLogs) { Console.WriteLine($"[{log.Level}] {log.Timestamp}: {log.Message}"); } </syntaxhighlight> '''输出:''' <pre> [ERROR] 5/15/2023 2:55:00 PM: Database connection failed </pre> == 高级过滤技巧 == === 动态过滤 === 可以使用变量动态构建过滤条件: <syntaxhighlight lang="csharp"> Func<Product, bool> filter = p => true; // 初始化为不过滤 // 根据用户输入动态添加条件 if (userWantsElectronics) filter = p => p.Category == "Electronics"; if (userHasMaxPrice) filter = p => filter(p) && p.Price <= userMaxPrice; var results = products.Where(filter); </syntaxhighlight> === 使用索引过滤 === `Where`方法有一个重载版本可以接受元素的索引: <syntaxhighlight lang="csharp"> // 只选择偶数索引位置的元素 var everyOther = numbers.Where((num, index) => index % 2 == 0); </syntaxhighlight> == 性能考虑 == * '''延迟执行''':LINQ查询通常是延迟执行的,只有在实际枚举结果时才会应用过滤条件。 * '''多次枚举''':如果多次枚举同一个查询结果,过滤条件会重复执行。可以使用`ToList()`或`ToArray()`缓存结果。 * '''IQueryable vs IEnumerable''':对于数据库查询,`IQueryable`会将过滤条件转换为SQL,在数据库端执行,效率更高。 == 常见问题 == === 空集合处理 === 对null集合调用LINQ方法会抛出异常。可以使用空集合模式: <syntaxhighlight lang="csharp"> var safeCollection = possiblyNullCollection ?? Enumerable.Empty<T>(); var filtered = safeCollection.Where(...); </syntaxhighlight> === 区分null和空字符串 === <syntaxhighlight lang="csharp"> // 只选择非null且非空的字符串 var validStrings = stringCollection.Where(s => !string.IsNullOrEmpty(s)); </syntaxhighlight> == 总结 == LINQ过滤是处理数据集合的强大工具,通过`Where`方法可以简洁地表达复杂的过滤逻辑。关键点包括: * 两种语法形式(查询语法和方法语法) * 支持简单和复杂的过滤条件 * 延迟执行特性 * 适用于各种数据源 * 提供动态构建查询的能力 掌握LINQ过滤将显著提高你的C#编程效率和代码可读性。 [[Category:编程语言]] [[Category:C Sharp]] [[Category:C Sharp LINQ]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)