首页 > 解决方案 > 在 .Net Standard 2.0 中替换 string.Contains(string, StringComparison)

问题描述

考虑以下代码:

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;
}

我创建了一个 .Net Standard 2.0 类型的项目,我想在其中使用上面的代码。但问题是不能使用这个重载:

.Contains method (query, StringComparison.InvariantCultureIgnoreCase)

它不存在。在 .NET Core 项目中,没有问题。对于方法的重载,您有解决方案或替代方案Contains()吗?

标签: c#.net-core.net-standard

解决方案


您可以使用IndexOfaStringComparison,然后检查结果是否为非负数:

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

可能会有一些非常小众的极端情况(例如,具有零宽度非连接字符),它们会给出不同的结果,但我希望它们在几乎所有情况下都是等价。话虽如此,GitHub 上的 .NET Core 代码表明Contains无论如何都是以这种方式实现的。


推荐阅读