How to make IEnumerable.Contains case-insensitive?

前端 未结 3 772
走了就别回头了
走了就别回头了 2020-12-09 01:34

Suppose I have a .net Array of strings.

string[] strings = new string[] { \"AbC\", \"123\", \"Xyz\", \"321\" };

If I wanted to see if the a

相关标签:
3条回答
  • 2020-12-09 01:48

    I personally like this guy's LambdaComparer, which is really useful for stuff like this:

    LINQ Your Collections with IEqualityComparer and Lambda Expressions

    Example Usage:

    var comparer = new LambdaComparer<string>(
        (lhs, rhs) => lhs.Equals(rhs, StringComparison.InvariantCultureIgnoreCase));
    
    var seq = new[]{"a","b","c","d","e"};
    
    Debug.Assert(seq.Contains("A", comparer));
    
    0 讨论(0)
  • 2020-12-09 01:51

    Use overloaded Enumerable.Contains method which accepts equality comparer:

    strings.Contains("ABC", StringComparer.InvariantCultureIgnoreCase)
    

    Also there is strings comparer in box which you can use.

    0 讨论(0)
  • 2020-12-09 02:01

    If for some reason you either prefer or are forced to use StringComparison and not StringComparer, you can add an extension method as follows:

    public static bool Contains(this IEnumerable<string> items, string value, StringComparison stringComparison)
    {
        StringComparer stringComparer;
    
        switch (stringComparison)
        {
            case StringComparison.CurrentCulture:
                stringComparer = StringComparer.CurrentCulture;
                break;
            case StringComparison.CurrentCultureIgnoreCase:
                stringComparer = StringComparer.CurrentCultureIgnoreCase;
                break;
            case StringComparison.InvariantCulture:
                stringComparer = StringComparer.InvariantCulture;
                break;
            case StringComparison.InvariantCultureIgnoreCase:
                stringComparer = StringComparer.InvariantCultureIgnoreCase;
                break;
            case StringComparison.Ordinal:
                stringComparer = StringComparer.Ordinal;
                break;
            case StringComparison.OrdinalIgnoreCase:
                stringComparer = StringComparer.OrdinalIgnoreCase;
                break;
            default:
                throw new NotImplementedException();
        }
    
        return items.Contains(value, stringComparer);
    }
    

    More variations on how to map these can be found in this question.

    0 讨论(0)
提交回复
热议问题