不敏感列表搜索
我有一个包含一串字符串的列表testList
。 我想添加一个新的字符串到testList
只要它不在列表中。 因此,我需要对列表进行不区分大小写的搜索并使其有效。 我无法使用Contains
因为它没有考虑到套管。 出于性能原因,我也不想使用ToUpper/ToLower
。 我遇到了这种方法,它的工作原理是:
if(testList.FindAll(x => x.IndexOf(keyword,
StringComparison.OrdinalIgnoreCase) >= 0).Count > 0)
Console.WriteLine("Found in list");
这有效,但它也匹配部分单词。 如果列表中包含“山羊”,我不能添加“燕麦”,因为它声称“燕麦”已经在列表中。 有没有一种方法来高效地以不区分大小写的方式搜索列表,其中单词必须完全匹配? 谢谢
而不是String.IndexOf,使用String.Equals来确保你没有部分匹配。 也不要使用FindAll,因为它会遍历每个元素,请使用FindIndex(它会在它碰到的第一个元素上停止)。
if(testList.FindIndex(x => x.Equals(keyword,
StringComparison.OrdinalIgnoreCase) ) != -1)
Console.WriteLine("Found in list");
或者使用一些LINQ方法(它也会在它碰到的第一个方法上停止)
if( testList.Any( s => s.Equals(keyword, StringComparison.OrdinalIgnoreCase) ) )
Console.WriteLine("found in list");
我意识到这是一个旧帖子,但为了防止其他人查找,可以通过提供不区分大小写的字符串相等比较器来使用Contains
,如下所示:
if (testList.Contains(keyword, StringComparer.OrdinalIgnoreCase))
{
Console.WriteLine("Keyword Exists");
}
根据msdn的说法,这已经可用.net 2.0。
基于上面的Adam Sills回答 - 这里有一个很好的清晰扩展方法,用于包含... :)
///----------------------------------------------------------------------
/// <summary>
/// Determines whether the specified list contains the matching string value
/// </summary>
/// <param name="list">The list.</param>
/// <param name="value">The value to match.</param>
/// <param name="ignoreCase">if set to <c>true</c> the case is ignored.</param>
/// <returns>
/// <c>true</c> if the specified list contais the matching string; otherwise, <c>false</c>.
/// </returns>
///----------------------------------------------------------------------
public static bool Contains(this List<string> list, string value, bool ignoreCase = false)
{
return ignoreCase ?
list.Any(s => s.Equals(value, StringComparison.OrdinalIgnoreCase)) :
list.Contains(value);
}
链接地址: http://www.djcxy.com/p/8711.html
下一篇: JavaScript: case