相关疑难解决方法(0)

string.ToLower()和string.ToLowerInvariant()

有什么区别以及何时使用什么?如果我总是使用ToLower()会有什么风险,如果我总是使用ToLowerInvariant(),风险又是什么?

.net c# string

150
推荐指数
4
解决办法
6万
查看次数

C#中字符串键类型的不区分大小写字典

如果我有一个Dictionary<String,...>是否有可能使方法ContainsKey不区分大小写?

这似乎是相关的,但我没有理解它:c#Dictionary:通过声明使Key不区分大小写

c# collections generic-collections

135
推荐指数
5
解决办法
5万
查看次数

String.Starts不使用亚洲语言?

我注意到这个奇怪的问题.看看这个越南语(根据谷歌翻译)字符串:

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)

这里发生了什么?!这怎么可能?

c# string

21
推荐指数
2
解决办法
1348
查看次数

StringComparison.Ordinal和InvariantCulture一样用于测试相等性吗?

从他们的简短摘要描述中,它听起来像字符串比较规则StringComparison.Ordinal,StringComparison.InvariantCulture并且意味着它们如何对字符串进行排序.这就是全部吗?也就是说,这是否意味着我们可以在进行相等比较时使用字符串比较规则?

string.Equals(a, b, StringComparison....)
Run Code Online (Sandbox Code Playgroud)

还有额外的功劳:如果我们进行比较OrdinalIgnoreCase,它会对答案产生影响InvariantCultureIgnoreCase吗?怎么样?

请提供支持论据和/或参考.

.net string culture equality string-comparison

19
推荐指数
2
解决办法
6187
查看次数

在C#中,将字符串与null进行比较以及""返回true的最佳方法是什么

我有以下代码(因为我试图检测字段的更改)

 if (person.State != source.State)
 {
      //update my data . .
  }
Run Code Online (Sandbox Code Playgroud)

问题是我遇到的情况是person.State为NULL而source.State为"",因此返回true.

如果一个为null而另一个是空字符串,我想将它们视为相等并且不更新我的数据.这样做最干净的方法是什么?我是否需要创建自己的Comparer对象,因为这似乎是一个普遍的问题

c# string string-comparison

10
推荐指数
3
解决办法
4716
查看次数

为什么OrdinalIgnoreCase和InvariantCultureIgnoreCase会返回不同的结果?

当涉及到仅限英语的字符串时,我想StringComparison.OrdinalIgnoreCaseStringComparison.InvariantCultureIgnoreCase做同样的工作.但是,我正在使用以下代码中的情况并非如此:

// Returns 0
string.Compare("877495169FA05B9D8639A0EBC42022338F7D2324","?877495169fa05b9d8639a0ebc42022338f7d2324", StringComparison.InvariantCultureIgnoreCase)

// Returns -1
string.Compare("877495169FA05B9D8639A0EBC42022338F7D2324","?877495169fa05b9d8639a0ebc42022338f7d2324", StringComparison.OrdinalIgnoreCase)
Run Code Online (Sandbox Code Playgroud)

有什么特别的原因吗?

c# string-comparison

10
推荐指数
1
解决办法
6485
查看次数

为什么大写字母大于.Net中的小写字母?

在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中的小写字母?

String.CompareTo方法(String)

c# java compare

9
推荐指数
1
解决办法
3764
查看次数

C# "anyString".Contains('\0', StringComparison.InvariantCulture) 在 .NET5 中返回 true 但在旧版本中返回 false

我在尝试将项目从 .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 中确实存在关于字符串比较的行为变化:

在 .NET 5+ 上比较字符串时的行为变化

另请参阅相关票证:

string.IndexOf 在 .Net 5 中得到不同的结果

虽然这个问题应该与上面有关,但与 …

c# .net-5 c#-9.0

9
推荐指数
1
解决办法
561
查看次数

了解字符串比较行为

我需要将一些字符串比较从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

c#

6
推荐指数
1
解决办法
194
查看次数

更改排序对象行为

使用映射到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?

powershell powershell-2.0

5
推荐指数
1
解决办法
1148
查看次数