Search code examples
c#listsearchcase-insensitive

Case-Insensitive List Search


I have a list testList that contains a bunch of strings. I would like to add a new string into the testList only if it doesn't already exist in the list. Therefore, I need to do a case-insensitive search of the list and make it efficient. I can't use Contains because that doesn't take into account the casing. I also don't want to use ToUpper/ToLower for performance reasons. I came across this method, which works:

    if(testList.FindAll(x => x.IndexOf(keyword, 
                       StringComparison.OrdinalIgnoreCase) >= 0).Count > 0)
       Console.WriteLine("Found in list");

This works, but it also matches partial words. If the list contains "goat", I can't add "oat" because it claims that "oat" is already in the list. Is there a way to efficiently search lists in a case insensitive manner, where words have to match exactly? thanks


Solution

  • Instead of String.IndexOf, use String.Equals to ensure you don't have partial matches. Also don't use FindAll as that goes through every element, use FindIndex (it stops on the first one it hits).

    if(testList.FindIndex(x => x.Equals(keyword,  
        StringComparison.OrdinalIgnoreCase) ) != -1) 
        Console.WriteLine("Found in list"); 
    

    Alternately use some LINQ methods (which also stops on the first one it hits)

    if( testList.Any( s => s.Equals(keyword, StringComparison.OrdinalIgnoreCase) ) )
        Console.WriteLine("found in list");