不敏感列表搜索

我有一个包含一串字符串的列表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

上一篇: Insensitive List Search

下一篇: JavaScript: case