C# 我是不是用错了?

C# 我是不是用错了?,c#,string,contains,C#,String,Contains,我身上发生了奇怪的事。我必须履行以下职能: private string CategoryByName(string path) { path.ToLower(); if (path.Contains("obs") || path.Contains("obst")||path.Contains("birthing")) return "Birthing"; if (path.Contains("sbu2")||(!path.Contains("sb

我身上发生了奇怪的事。我必须履行以下职能:

private string CategoryByName(string path) {
        path.ToLower();
        if (path.Contains("obs") || path.Contains("obst")||path.Contains("birthing")) return "Birthing";
        if (path.Contains("sbu2")||(!path.Contains("sbu3")&&path.Contains("gyn"))) return "Gynecology SBU2";
        if (path.Contains("sbu3")) return "Gynecology SBU3";
        if (path.Contains("dia") || path.Contains("sprint")||(path.Contains("strechers"))) return "Strechers";
        if (path.Contains("one_day") || path.Contains("one day") || (path.Contains("oda"))) return "One-day care";
        return "";            
    }

我浏览了一个文件名列表。包括例如“INDO OBST.xlsx”,它应返回为“Birthing”,但返回为“”

Contains区分大小写,从ToLower()判断,您知道这一点。

但是,ToLower()不操纵path变量。相反,您应该重新分配它。您可以通过将
path.ToLower()
更改为
path=path.ToLower()
来执行此操作。ToLower方法返回调整后的字符串:

path = path.ToLower();

编写一个如下所示的扩展方法:

public static class Extensions
{
    public static bool ContainsNoCase(this string stringToLookIn, string stringToFind)
    {
        return stringToLookIn.IndexOf(stringToFind, StringComparison.OrdinalIgnoreCase) >= 0;
    }
}

并使用
ContainsNoCase
代替
Contains

path=path.ToLower()
-
ToLower()
返回一个新字符串,它不会(也不能)更改path.God中的现有字符串。非常感谢。或者编写您自己的Contains方法,使用
String.IndexOf
重载进行字符串比较:在
path.Contains(“obs”)| | path.Contains(“obst”)
中有一个更完全不相关的细节,但是在
path.Contains(“obst”)
中,对
path.Contains(“obst”)
的测试是多余的,因为包含“obst”的字符串显然也将始终包含“obs”;-)
ToUpperInvariant
是这样做的必要条件:@kara这仍然需要您重新分配变量。与其他答案所建议的调用
ToLower
相比,它的一个优点是不会创建不必要的临时字符串。被否决的投票人是否愿意评论他/她的理由。这是可行的,并且不需要为每次比较创建新字符串(通过
ToLower
ToUpper
)。它还提供了非常清晰的代码。有趣的是,这个问题的每个答案都有一个反对票。