Search code examples
c#.net-core.net-standard

Replacement for string.Contains(string, StringComparison) in .Net Standard 2.0


Consider the following codes :

public static IQueryable<T> WhereDynamic<T>(this IQueryable<T> sourceList, string query)
{
    if (string.IsNullOrEmpty(query))
    {
        return sourceList;
    }

    try
    {
        var properties = typeof(T).GetProperties()
            .Where(x => x.CanRead && x.CanWrite && !x.GetGetMethod().IsVirtual);

        //Expression
        sourceList = sourceList.Where(c =>
            properties.Any(p => p.GetValue(c) != null && p.GetValue(c).ToString()
                .Contains(query, StringComparison.InvariantCultureIgnoreCase)));
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
    }

    return sourceList;
}

I have created a project of type .Net Standard 2.0 and I want to use the above code in it. But the problem is that it is not possible to use this overload:

.Contains method (query, StringComparison.InvariantCultureIgnoreCase)

It does not exist. While in a .NET Core project, there is no problem. Do you have a solution or alternative to that overload of the Contains() method?


Solution

  • You can use IndexOf with a StringComparison, and then check if the result is non-negative:

    string text = "BAR";
    bool result = text.IndexOf("ba", StringComparison.InvariantCultureIgnoreCase) >= 0;
    

    It's possible that there will be some really niche corner cases (e.g. with a zero-width non-joiner character) where they'll give a different result, but I'd expect them to be equivalent in almost all cases. Having said that, the .NET Core code on GitHub suggests that Contains is implemented in exactly this way anyway.