Linq +Contains+ Case Insensitive 检索查询不区分大小写方法

本文介绍五种实现LINQ大小写不敏感查询的方法,包括字符串转换、使用StringComparer.OrdinalIgnoreCase、扩展方法、利用IndexOf结合CompareOptions及 StringComparison等。

通常我们在查询中会只输入关键词来检索,有时候字母会有大小写区分,SQL里面like 是不区分大小写检索的,但是LINQ中会、解决方法如下:

1:  全部转换为大写或者小写进行检索 如:

string name = "Hello";
 var employees = context.employees.Where(emp => emp.Name.ToLower().Contains(name.ToLower()));

2:利用Contains 里面的 StringComparer.OrdinalIgnoreCase 来判断

StringComparer.OrdinalIgnoreCase的解释:https://msdn.microsoft.com/zh-cn/library/5hc8kytd(v=vs.110).aspx

                  List<string> list = new List<string>() { "a", "b", "c", "d", "e" };
         string value = "A";

         if (list.Contains(value, StringComparer.OrdinalIgnoreCase))
             Console.WriteLine(value + "在列表中!");
         else
             Console.WriteLine(value + " 不在列表中!");

3:扩展一个方法利用StringComparison 枚举 来进行判断比较

StringComparison 枚举的解释:https://msdn.microsoft.com/zh-cn/library/system.stringcomparison(v=vs.110).aspx

         public static bool Contains(this string src, string toCheck, StringComparison comp)
         {
             return src.IndexOf(toCheck, comp) >= 0;
         }

4:利用indexof+CompareOptions.IgnoreCase 进行不区分大小写比较后 大于等于0来判断

     getStockData = getStockData.Where(p => CultureInfo.CurrentCulture.CompareInfo.IndexOf(p.Descr_C, strSkuContent, CompareOptions.IgnoreCase) >= 0).ToList();
 

5:利用indexof+StringComparison.OrdinalIgnoreCase进行不区分大小写比较后 大于等于0来判断

      getStockData = (from p in getStockData where p.Descr_C.IndexOf(strSkuContent, StringComparison.OrdinalIgnoreCase) >= 0 select p).ToList<SearchExportStock>();


以上5种方法总有一种适合你的。



其他资料参考:

http://stackoverflow.com/questions/15362926/linq-to-entities-contains-case-in-sensitive-searching
        stackoverflow.com/questions/27107132/case-insensitive-contains-in-linq

<think>嗯,用户问的是在C#中`keyList.Contains("Mo")`是否区分大小写。我需要先回忆一下C#中的相关方法。记得在C#里,`List<T>.Contains`方法默认的行为是区分大小写的,因为它使用的是默认的相等比较器。对于字符串来说,默认的比较是区分大小写的,所以如果`keyList`是一个`List<string>`,那么`Contains("Mo")`会检查是否有完全匹配大小写的元素。 过,也有可能用户使用的是同的集合类型,比如`HashSet<string>`或者其他集合,但通常来说`Contains`的行为是一致的。如果用户想区分大小写,可能需要使用其他方法,比如LINQ的`Any`方法配合字符串比较选项,或者使用`Exists`方法并提供一个自定义的比较器。例如,使用`StringComparer.OrdinalIgnoreCase`来忽略大小写。 另外,用户可能是在处理某个具体的问题,比如用户输入或者数据库查询,这时候是否区分大小写可能会影响结果,所以需要明确回答默认行为,并提供如何改变大小写敏感性的方法。需要确保回答准确,并且给出示例代码,帮助用户理解如何实现区分大小写的检查。同时,要提醒用户注意性能问题,比如使用`ToUpper()`或`ToLower()`可能会影响性能,特别是在大数据集的情况下,推荐使用带有比较器的方法更高效。 还要考虑用户可能的错误,比如是否混淆了同集合类型的方法,或者是否在LINQ to Entities中使用导致无法转换的情况,这时候需要指出同场景下的处理方式。总之,回答要全面,涵盖默认情况、如何改变大小写敏感性,以及在同场景下的注意事项,并提供代码示例帮助用户实际应用。</think>在 C# 中,`keyList.Contains("Mo")` 是否区分大小写取决于 **集合类型** 和 **比较方式**。以下是具体分析: --- ### 一、默认行为:区分大小写 #### 1. 当 `keyList` 为 `List<string>` 时 ```csharp List<string> keyList = new List<string> { "MO", "mo", "Mo" }; bool result = keyList.Contains("Mo"); // 返回 true(若存在完全匹配项) // 如果列表中有 "Mo" 则返回 true,否则返回 false ``` #### 2. 当 `keyList` 为 `string[]` 时 ```csharp string[] keyList = { "MO", "mo", "Mo" }; bool result = keyList.Contains("Mo"); // 行为与 List<string> 一致 ``` --- ### 二、区分大小写的判断方法 #### 方法 1:使用 `StringComparer` ```csharp List<string> keyList = new List<string> { "MO", "mo", "Test" }; bool result = keyList.Contains("Mo", StringComparer.OrdinalIgnoreCase); // 返回 true ``` #### 方法 2:LINQ + `Any` ```csharp bool result = keyList.Any(x => x.Equals("Mo", StringComparison.OrdinalIgnoreCase)); ``` #### 方法 3:统一大小写 ```csharp bool result = keyList.Select(x => x.ToLower()).Contains("mo".ToLower()); ``` --- ### 三、同集合类型的注意事项 | **集合类型** | **默认是否区分大小写** | **如何控制大小写敏感性** | |-----------------------|-------------------------|---------------------------------------| | `List<string>` | 是 | 使用 `StringComparer` 参数 | | `HashSet<string>` | 是 | 构造函数传入 `StringComparer` | | LINQ to Objects | 是 | 搭配 `StringComparison` 参数 | | LINQ to SQL/EF Core | 依赖数据库配置 | 需在数据库或 LINQ 查询中处理 | --- ### 四、性能优化建议 1. **高频查询场景**:优先使用 `HashSet<string>` + `StringComparer` ```csharp var caseInsensitiveSet = new HashSet<string>(keyList, StringComparer.OrdinalIgnoreCase); bool result = caseInsensitiveSet.Contains("Mo"); ``` 2. **避免冗余转换**:要重复调用 `ToLower()`/`ToUpper()` --- ### 五、常见错误示例 ```csharp // ❌ 错误:ToList() 会丢失大小写敏感性控制 var wrongResult = keyList.Select(x => x.ToLower()).ToList().Contains("Mo"); // ✅ 正确:统一转换后再比较 var correctResult = keyList.Select(x => x.ToLower()).Contains("mo".ToLower()); ``` --- ### 总结 - **默认区分大小写** - **可通过参数控制区分大小写** - 根据实际场景选择最优方案(性能与代码可读性平衡)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值