如何在List<string>中忽略大小写敏感性

68

假设我有以下代码

string seachKeyword = "";
List<string> sl = new List<string>();
sl.Add("store");
sl.Add("State");
sl.Add("STAMP");
sl.Add("Crawl");
sl.Add("Crow");
List<string> searchResults = sl.FindAll(s => s.Contains(seachKeyword));

如何忽略Contains搜索中的大小写?

谢谢。

12个回答

89

使用Linq,这将为.Compare添加一个新方法。

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

List<string> MyList = new List<string>();
MyList.Add(...)
if (MyList.Contains(TestString, StringComparer.CurrentCultureIgnoreCase)) {
    //found
} 

因此,假定

using System.Linq;
...

List<string> searchResults = sl.FindAll(s => s.Contains(seachKeyword, StringComparer.CurrentCultureIgnoreCase));  

4
啊哈!我误用了字符串比较!谢谢! - Steve's a D
只是一点提示:这种情况下它不能用于在文本中搜索单词,因为 contains 会搜索完整的文本。 当然,这并不是问题中的场景,您的答案完全正确。 :) - Ankur-m
1
@Ankur-m,你可能需要一个正则表达式来解决这个问题。现在你有两个问题了。 - CAD bloke
@CADbloke,我已经在不使用正则表达式的情况下使其工作。请查看我在此帖子中的评论:使用Linq检查列表中的字符串是否包含特定字符串 - Ankur-m
啊,知道 Linq 添加了那个很方便。 - Nyerguds

66

最佳选择是使用序数不区分大小写比较,但是 Contains 方法不支持该操作。

您可以使用以下代码来实现:

sl.FindAll(s => s.IndexOf(searchKeyword, StringComparison.OrdinalIgnoreCase) >= 0);

最好将此代码封装为扩展方法,例如:

public static bool Contains(this string target, string value, StringComparison comparison)
{
    return target.IndexOf(value, comparison) >= 0;
}

所以您可以使用:

sl.FindAll(s => s.Contains(searchKeyword, StringComparison.OrdinalIgnoreCase));

3
这是否意味着,根据OP问题中的列表,sl.FindAll(s => s.Contains("stat", StringComparison.OrdinalIgnoreCase)); 将返回 true?虽然合理,但我更喜欢在 List<string> 上使用 Contains,仅在两个字符串的长度相等时返回 true,而不考虑大小写,而不是在 List<string> 中包含一个包含搜索参数的字符串时返回 true。所以... return target.IndexOf(value, comparison) >= 0 && target.Length == value.Length; - GCymbala
如果我能的话,我给你加上2分。正是我所需要的内容。 - Kieran Quinn

28

您可以通过提供不区分大小写的字符串相等比较器来使用Contains,如下所示:

if (myList.Contains(keyword, StringComparer.OrdinalIgnoreCase))
{
    Console.WriteLine("Keyword Exists");
}

2
请注意,您需要包含 linq "using System.Linq;"。 - David Chiew
这是真正的答案。 - Ayo Adesina

7
StringComparer.CurrentCultureIgnoreCase is a better approach instead of using indexOf.

为什么使用includes比使用indexOf更好呢? - Mong Zhu

6
最佳解决方案是在进行比较时忽略大小写。
List<string> searchResults = sl.FindAll(s => s.IndexOf(seachKeyword, System.StringComparison.OrdinalIgnoreCase) >= 0);

1
以下方法将搜索您需要的关键字,并将所有搜索到的项目插入到新列表中,然后返回新列表。
private List<string> serchForElement(string searchText, list<string> ListOfitems)
{            
    searchText = searchText.ToLower();
    List<string> Newlist = (from items in ListOfitems
                         where items.ToLower().Contains(searchText.ToLower())
                         select items).ToList<string>(); 

返回 Newlist;


1
最好包含一份代码的解释。 - Anh Pham
"ListOfitems" 是您的列表。searchText 是要搜索的关键字。我犯了一个错误,就是两次使用小写字母。这并不需要两次。 - Shakeeb Mohammed

1
在最新的支持中,我们可以使用LINQ来检查类似的条件,甚至更加简单和优雅。
using System.Linq

var strToCompare = "Hello";
bool match = myList.Any(x => string.Compare(x, strToCompare, StringComparison.OrdinalIgnoreCase) == 0);

0

对于那些在搜索列表中遇到问题的人,我找到了一个解决方案。

在这个例子中,我正在搜索一个嵌套列表,并仅获取第一个字符串与参数匹配的列表。

List<List<string>> TEMPList = new List<List<string>>();

TEMPList = JaggedList.FindAll(str => str[0].ToLower().Contains(arg.ToLower()));

DoSomething(TEMPList);

0

你可以使用一个小技巧来解决这个问题。
将所有字符串更改为相同的大小写:要么是大写或小写

List searchResults = sl.FindAll(s => s.ToUpper().Contains(seachKeyword.ToUpper()));


0

FindAll会枚举整个列表。

更好的方法是在找到第一个实例后中断。

bool found = list.FirstOrDefault(x=>String.Equals(x, searchKeyWord, Stringcomparison.OrdinalIgnoreCase) != null;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接