Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将字符串中不带空格的每个字符除第一个字母外改为小写_C#_String_Ifc - Fatal编程技术网

C# 将字符串中不带空格的每个字符除第一个字母外改为小写

C# 将字符串中不带空格的每个字符除第一个字母外改为小写,c#,string,ifc,C#,String,Ifc,我有字符串,我从如下文档中读取: IFCPERSONANDORGANIZATION IfcPersonAndOrganization 我的目标是创建一个名为“相同”的类的新实体。因此,我需要这个字符串来匹配类名。但是,类名(我无法更改)如下所示: IFCPERSONANDORGANIZATION IfcPersonAndOrganization 是否有任何方法可以更改输入字符串,使其与大写和小写的类名匹配 不幸的是,ToTitle不适用于我的目的,因为我的输入字符串中没有空格。 但是,我

我有字符串,我从如下文档中读取:

IFCPERSONANDORGANIZATION
IfcPersonAndOrganization
我的目标是创建一个名为“相同”的类的新实体。因此,我需要这个字符串来匹配类名。但是,类名(我无法更改)如下所示:

IFCPERSONANDORGANIZATION
IfcPersonAndOrganization
是否有任何方法可以更改输入字符串,使其与大写和小写的类名匹配

不幸的是,ToTitle不适用于我的目的,因为我的输入字符串中没有空格。 但是,我有一个文本文件,其中包含所有可能的类名(~800)。因此,我可能会编写一个方法,检查文本文件中是否有匹配的名称,并相应地更改输入字符串。我担心这会花费很长时间,而且效率很低。 编辑:文本文件每行包含一个类名


任何人都有可能更优雅、更快的想法吗?

当然,您可以将文件内容读入列表,然后检查输入字符串是否包含在列表中(使用不区分大小写的比较)。如果是,您只需将字符串替换为列表中的字符串:

// The input string we want to format
var input = "IFCPERSONANDORGANIZATION";

// Read the file containing your class names into an array
var filePath = @"f:\public\temp\classnames.txt";
var knownClassNames = File.ReadAllLines(filePath);

// See if the list contains the name using a case-insensitive comarison. 
// If it does, `FirstOrDefault` will return a non-null value, so we assign the result
// Otherwise, if it returns null (which is checked by `??`) we leave it as is.
input = knownClassNames
    .FirstOrDefault(name => name.Equals(input, StringComparison.OrdinalIgnoreCase)) 
    ?? input;
这可以放在一个简单的函数中,您可以从任何地方调用该函数:

public static string CorrectClassNameCasing(string input)
{
    var filePath = @"f:\public\temp\classnames.txt";
    var knownClassNames = File.ReadAllLines(filePath);

    return knownClassNames
        .FirstOrDefault(name => name.Equals(input, StringComparison.OrdinalIgnoreCase)) ?? input;
}
在我的示例中,我创建了一个仅包含您在示例中提到的一个类名的文件:

static void Main()
{
    Console.WriteLine(CorrectClassNameCasing("IFCPERSONANDORGANIZATION"));
    Console.WriteLine(CorrectClassNameCasing("THISDOESNOTEXIST"));

    Console.Write("\nDone!\nPress any key to continue...");
    Console.ReadKey();
}
结果如下:


“我可能会编写一个方法,检查文本文件中是否有匹配的名称,并相应地更改输入字符串”——是的,您可以。“我担心这会花费很长时间,而且效率很低”——恐惧并不是不尝试的理由,尤其是在编程方面。与其让这里的每个人都来评估可能性,不如你真的尝试一下。如果您有特定的问题需要帮助,您可以稍后再问一个真正的问题。值得一提的是,您可以将
StringComparer.OrdinalIgnoreCase
传递给
字典
构造函数,在字典中填入类名的标识映射(即键和值相同的位置),然后在字典里查所有大写字母的名字。我希望这是合理有效的。谢谢你的回答,我会给我建议的方案以及你的方案一次尝试,看看什么效果更好!我又投票支持你了!非常感谢你的回答,这也是我刚才写的。这就是我在问题中提到的方法,所以很可能这就是否决票的来源。我还是不明白为什么。我真的很感谢你花了这么多时间和精力来回答!我用我合适的列表试过了,速度相当快,所以我会坚持这样做。再次干杯!