在 .Net Standard 2.0 中替换 string.Contains(string, StringComparison)

Posted

技术标签:

【中文标题】在 .Net Standard 2.0 中替换 string.Contains(string, StringComparison)【英文标题】:Replacement for string.Contains(string, StringComparison) in .Net Standard 2.0 【发布时间】:2020-12-01 21:17:06 【问题描述】:

考虑以下代码:

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() 方法的重载,您有解决方案或替代方案吗?

【问题讨论】:

根据docs.microsoft.com/en-us/dotnet/api/… 应该没问题。现在自己测试一下。如果您可以在此处提供 minimal reproducible example 将会很有帮助 - 此处几乎所有代码都无关紧要,因为您只需要显示 string.Contains 调用即可。 啊,我误读了文档 - 它没有提供每个重载版本信息。 Use .NET Standard 2.1 如果可以的话。 @JonSkeet:使用 .NetStandard 项目时出现此错误:错误 CS1501 方法“包含”没有重载需要 2 个参数 @CaiusJard:谢谢 - 我只是依赖底部的版本号,大概就是“存在任何这些重载的版本”。 【参考方案1】:

可以使用IndexOf with a StringComparison,然后检查结果是否为非负:

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

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

【讨论】:

哇,文档不清楚this overload 在哪里可用,在哪里不可用。看起来它确实似乎应该随处可用。 @ToddMenier:我同意。 “适用于”位似乎意味着“对于任何重载”,而不是基于每个重载:(【参考方案2】:

Jon 有正确答案,我只需要验证他的答案,Contains 实现在.NET Framework 中使用IndexOf。您可以做的是为 .NET Standard 中未包含的任何方法添加扩展。

对于您的Contains,扩展程序希望:

public static bool Contains(this string str, string value,  StringComparison comparison)

    return str.IndexOf(value, comparison) >= 0;

您可以对重置执行相同的操作。如果您需要更多实现细节,可以查看Microsoft Reference,这将使您对 .NET 底层实现有一个很好的了解。

【讨论】:

以上是关于在 .Net Standard 2.0 中替换 string.Contains(string, StringComparison)的主要内容,如果未能解决你的问题,请参考以下文章

为啥 .NET 框架项目可以作为参考添加到 .NET Standard 2.0 项目中?

无法在 Rider 中使用 .NET Standard 2.0 Lib 加载 Xamarin Forms 项目

Xamarin.Forms 中用于 .Net Standard 2.0 的 ModernHttpClient

将 .NET Core 2.0 类库转换为 .NET Standard

使用 blazor 加载外部 .NET Standard 2.0 程序集

.Net 45 来自 .Net Standard 2.0 dll 的序列化