【问题标题】:String[0] vs ToCharArray then Char[0]String[0] vs ToCharArray 然后 Char[0]
【发布时间】:2013-01-02 16:17:13
【问题描述】:

假设我想获取字符串中的第三个字母。

string s = "cats";

使用s[2]获取值有什么区别, 正如我在网上看到的大多数示例:

char[] c = s.ToCharArray();
char x = c[2];

【问题讨论】:

  • s[2] 更干净。在我看来

标签: c# .net char


【解决方案1】:
  • 如果您需要特定索引处的字符,请使用"cats"[2]
  • 如果您需要将整个字符串作为字符数组,请使用"cats".ToCharArray()

【讨论】:

  • 正确。在你的情况下做一个 ToCharArray 会有点矫枉过正
  • 另外,string.GetEnumerator()(当您通过foreach 一次通过stringchar 时)也不会创建字符串的副本。这意味着在许多情况下它仍然比.ToCharArray() 更有效。
  • 在 ReverseString 方法中,一个与另一个相比有什么好处吗?
【解决方案2】:

不同之处在于您不必要地创建了一个字符数组。使用 s[2]。

【讨论】:

    【解决方案3】:

    s[2] 方法只是在该位置查找字符并返回它。

    s.ToCharArray(); 方法分配一个新的char[],然后c[2] 在数组中查找它。

    如果您只需要一个字符,请使用s[2] 方法,因为ToCharArray() 方法很浪费。如果您需要将字符串中的所有字符作为char[],那么ToCharArray() 方法更简洁,可能更快(我没有做过任何基准测试,所以不要坚持) .

    编辑

    MS.NET 和 Mono 的 string.ToCharArray() 实现都使用不安全代码来固定内部 char 和重复的 char[] 并对指针进行操作。这绝对比为每个字符调用索引器要快,并且可能比使用枚举器遍历所有字符要快。另外,我发现它更简洁,尤其是在它用作参数的情况下:

    DoSomethingWithCharArray(s.ToCharArray());
    

    int i = 0;
    char[] arr = new char[s.Length];
    foreach (char c in s)
    {
        arr[i] = c;
        i++;
    }
    
    DoSomethingWithCharArray(arr);
    

    char[] arr = new char[s.Length];
    for (int i = 0; i < s.Length; i++)
    {
        arr[i] = s[i];
    }
    
    DoSeomthingWithCharArray(arr);
    

    【讨论】:

    • 为什么ToCharArray()更好?这是可能的,但我认为应该在这个答案中解释。
    • 嗯,它比 s[i] 的 for 循环更干净,而且它可能性能更好,但我没有进行任何基准测试或测试,所以我决定不假设确实如此。
    • 好的,感谢您扩展答案。我个人会考虑直接在s 清洁器上运行for,但这并不重要。当我下次面临决定时,我会尝试找出一些基准:)
    • 查看 .NET 参考源,他们固定内部 char[] 和重复的 char[] 并调用托管方法 wstrcpy 进行一些指针数学运算。这将比 for 循环快得多。 Mono's string implementation 固定两个数组并使用它们自己的托管实现 memcpy。我会编写自己的基准测试,但很明显,这两种实现都比为每个字符调用索引器更快(它必须为每个字符固定和取消固定字符串)
    【解决方案4】:

    如果您只是读取字符,则差异只是内存占用稍大。但是,如果您还想更改某些字符并保留原始字符串,那么使用ToCharArray 非常有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 2021-10-10
      • 1970-01-01
      相关资源
      最近更新 更多