关于C#:如何忽略列表中的区分大小写<string>


How to ignore the case sensitivity in List<string>

假设我有这个密码

1
2
3
4
5
6
7
8
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));

如何在包含搜索中忽略字母大小写?

谢谢,


使用Linq,这会将新方法添加到.Compare

1
2
3
4
5
6
7
8
using System.Linq;
using System.Collections.Generic;

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

所以大概

1
2
3
4
using System.Linq;
...

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


最好的选择是使用顺序不区分大小写的比较,但是Contains方法不支持这种比较。

您可以使用以下方法执行此操作:

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

最好用扩展方法包装它,例如:

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

所以你可以使用:

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


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

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


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


最佳解决方案是在执行比较时忽略情况。

1
List<string> searchResults = sl.FindAll(s => s.IndexOf(seachKeyword, System.StringComparison.OrdinalIgnoreCase) >= 0);

下面的方法将搜索您需要的关键字,并将所有搜索项插入到新列表中,然后返回新列表。

1
2
3
4
5
6
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>();

返回新列表;}


简单地说,您可以像下面这样使用LINQ查询,

1
2
3
4
5
6
String str ="StackOverflow";
int IsExist = Mylist.Where( a => a.item.toLower() == str.toLower()).Count()
if(IsExist > 0)
{
     //Found
}

findall对整个列表进行枚举。

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

bool found=list.firstordefault(x=>string.equals(x,searchKeyword,stringComparison.ordinalIgnoreCase)!= NULL;


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

在这个例子中,我搜索一个锯齿状的列表,只获取第一个字符串与参数匹配的列表。

1
2
3
4
5
List<List<string>> TEMPList = new List<List<string>>();

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

DoSomething(TEMPList);

你可以用小把戏来对付这个。将所有字符串更改为相同的大小写:大写或小写

list searchresults=sl.findall(s=>s.toupper().contains(seachkeyword.toupper());


其中一个可能(可能不是最好的)是将所有字符串小写放入SL中。然后将search关键字小写。

另一个解决方案是编写另一个方法,将2个字符串参数小写并进行比较