有什么区别以及何时使用什么?如果我总是使用ToLower()会有什么风险,如果我总是使用ToLowerInvariant(),风险又是什么?
如果我有一个Dictionary<String,...>是否有可能使方法ContainsKey不区分大小写?
这似乎是相关的,但我没有理解它:c#Dictionary:通过声明使Key不区分大小写
我注意到这个奇怪的问题.看看这个越南语(根据谷歌翻译)字符串:
string line = "Mìng-d??ng-ng??";
string sub = "Mìng-d??ng-ng?";
line.Length
15
sub.Length
14
line.StartsWith(sub)
false
Run Code Online (Sandbox Code Playgroud)
在我看来,这似乎是一个错误的结果.所以,我实现了我的自定义StartWith函数,它比较字符串char-by-char.
public bool CustomStartWith(string parent, string child)
{
for (int i = 0; i < child.Length; i++)
{
if (parent[i] != child[i])
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
而我猜测,运行此功能的结果
CustomStartWith("Mìng-d??ng-ng??", "Mìng-d??ng-ng?")
true
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?!这怎么可能?
从他们的简短摘要描述中,它听起来像字符串比较规则StringComparison.Ordinal,StringComparison.InvariantCulture并且意味着它们如何对字符串进行排序.这就是全部吗?也就是说,这是否意味着我们可以在进行相等比较时使用字符串比较规则?
string.Equals(a, b, StringComparison....)
Run Code Online (Sandbox Code Playgroud)
还有额外的功劳:如果我们进行比较OrdinalIgnoreCase,它会对答案产生影响InvariantCultureIgnoreCase吗?怎么样?
请提供支持论据和/或参考.
我有以下代码(因为我试图检测字段的更改)
if (person.State != source.State)
{
//update my data . .
}
Run Code Online (Sandbox Code Playgroud)
问题是我遇到的情况是person.State为NULL而source.State为"",因此返回true.
如果一个为null而另一个是空字符串,我想将它们视为相等并且不更新我的数据.这样做最干净的方法是什么?我是否需要创建自己的Comparer对象,因为这似乎是一个普遍的问题
当涉及到仅限英语的字符串时,我想StringComparison.OrdinalIgnoreCase并StringComparison.InvariantCultureIgnoreCase做同样的工作.但是,我正在使用以下代码中的情况并非如此:
// Returns 0
string.Compare("877495169FA05B9D8639A0EBC42022338F7D2324","?877495169fa05b9d8639a0ebc42022338f7d2324", StringComparison.InvariantCultureIgnoreCase)
// Returns -1
string.Compare("877495169FA05B9D8639A0EBC42022338F7D2324","?877495169fa05b9d8639a0ebc42022338f7d2324", StringComparison.OrdinalIgnoreCase)
Run Code Online (Sandbox Code Playgroud)
有什么特别的原因吗?
在Java中:
"A".compareTo("a"); return -32 //"A" is less than "a".
Run Code Online (Sandbox Code Playgroud)
在.Net中,使用String.CompareTo:
"A".CompareTo("a"); return 1 //"A" is greater than "a".
Run Code Online (Sandbox Code Playgroud)
在.Net中,使用Char.CompareTo:
'A'.CompareTo('a'); return -32 //"A" is less than "a".
Run Code Online (Sandbox Code Playgroud)
我知道Java使用它在unicode表中的位置比较字符串字符,但.Net不是.如何确定哪个大写字母大于.Net中的小写字母?
我在尝试将项目从 .NET core 3.1 升级到最新的 .NET 5 时遇到了不兼容的问题。
我的原始代码有一个验证逻辑,通过检查从 Path.GetInvalidFileNameChars() API 返回的每个字符来检查无效的文件名字符。
var invalidFilenameChars = Path.GetInvalidFileNameChars();
bool validFileName = !invalidFilenameChars.Any(ch => fileName.Contains(ch, StringComparison.InvariantCulture));
Run Code Online (Sandbox Code Playgroud)
假设您为 fileName 提供了一个常规值,例如应该有效的“test.txt”。然而,令人惊讶的是,如果您使用“net5”目标框架运行,上面的代码给出的文件名无效。
在调试了一段时间后,我发现返回的无效字符集包含 '\0'、空 ASCII 字符和 "text.txt".Contains("\0, StringComparison.InvariantCulture) 为真。
class Program
{
static void Main(string[] args)
{
var containsNullChar = "test".Contains("\0", StringComparison.InvariantCulture);
Console.WriteLine($"Contains null char {containsNullChar}");
}
}
Run Code Online (Sandbox Code Playgroud)
如果您在 .NET core 3.1 中运行,它永远不会说常规字符串包含空字符。此外,如果我省略第二个参数 (StringComparison.InvariantCulture) 或者如果我使用 StringComparison.Ordinal,则永远不会返回奇怪的结果。
为什么在 .NET5 中改变了这种行为?
编辑: 正如 Karl-Johan Sjögren 之前所评论的,.NET5 中确实存在关于字符串比较的行为变化:
另请参阅相关票证:
string.IndexOf 在 .Net 5 中得到不同的结果
虽然这个问题应该与上面有关,但与 …
我需要将一些字符串比较从vb转换为c#.vb代码使用>和<运算符.我希望用标准的框架字符串比较方法替换它.但是,有一种我不理解的行为.为了复制这个,我有这个测试
[TestMethod]
public void TestMethod2()
{
string originalCulture = CultureInfo.CurrentCulture.Name; // en-GB
var a = "d".CompareTo("t"); // returns -1
var b = "T".CompareTo("t"); // returns 1
Assert.IsTrue(a < 0, "Case 1");
Assert.IsTrue(b <= 0, "Case 2");
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么b返回1.我目前的理解是,如果它区分大小写,那么"T"应该在排序顺序中的"t"之前,即-1.如果它不区分大小写,它将是相同的,即0
(仅供参考.Net Framework 4.5.2)
很多thx
使用映射到Linux共享的驱动器时,文件名区分大小写.PowerShell按预期处理这个,但我想以类似于"C"语言环境中使用的排序顺序对输出进行排序,这意味着按字符值从U + 0000一直到U +按升序排序10FFFF(例如'0foo'出现在'Foo'之前,'Foo'出现在'bar'之前,'bar'出现在'foo'之前)
为了说明问题:
PS > gci Z:\foo | sort -casesensitive
xyz
Xyz
XYZ
yZ
YZ
Run Code Online (Sandbox Code Playgroud)
所需输出:
XYZ
Xyz
YZ
xyz
yZ
Run Code Online (Sandbox Code Playgroud)
我尝试将当前线程的文化变量设置为[System.Globalization.CultureInfo]::InvariantCulture,但我没有成功:
$thrd = [Threading.Thread]::CurrentThread
$thrd.CurrentCulture = [Globalization.CultureInfo]::InvariantCulture
$thrd.CurrentUICulture = $thrd.CurrentCulture
Run Code Online (Sandbox Code Playgroud)
当我认为它与文化信息有关时,我甚至关闭了,还是我真的偏离轨道?有谁知道我应该从哪里开始?我猜我需要暂时创建一个具有我想要的行为的CultureInfo实例,但是只有CompareInfo才有getter,更不用说我不确定如何重载SortInfo的CompareInfo.Compare函数需要使用PowerShell函数.或者这实际上是一个失败的原因,因为这是不可能的?
编辑
至少,是否可以先用大写字符排序,如XYZ,Xyz,xyz,YZ,yZ?