【问题标题】:C# - Filling an array using a Strings chars doesn't work properlyC# - 使用字符串字符填充数组无法正常工作
【发布时间】:2015-07-19 12:34:09
【问题描述】:

我有一个

int[,] map = int[100, 100];

还有一个

String mapString;

mapString 只包含大量数字(除了数字之外没有其他字符)。

我现在想用 mapString 的第一个字符分配数组 (map[0,0]) 中的第一个值,第二个值( map[0,1]) 与 mapString 的第二个字符,依此类推。我使用以下代码:

int currentposition = 0;
for (int x = 0; x < 100; x++)
{
    for (int y = 0; y < 100; y++)
    {
        map[x, y] = ArrayTest.Properties
                             .Settings
                             .Default
                             .mapSaveSetting
                             .ElementAt(currentposition);
        currentposition++;
    }
}

现在发生的事情几乎是我所希望的。 问题是它为每个值分配了两个数字而不是一个。我也无法弄清楚他使用的数字,因为它们不是我的 mapSaveSetting 中的数字,但我可以自己处理。

我真正不明白的唯一问题是执行此 for 循环后每个值都包含两个数字。为什么会这样? ElementAt(int) 只返回一个字符,对吧?

在我看来这确实是一个逻辑错误,但我找不到它。如果我只是在我的思维方式上犯了一个愚蠢的错误,请不要冒犯。

编辑 由于现在似乎不清楚是什么问题,我将添加一个示例。

map[0, 0] == 42

...可能是一个输出。即使字符串以例如开头4245634 这没有意义,因为 ElementAt(int) 应该只返回 4,而不是 42,对吧?

【问题讨论】:

  • "每个值包含两个数字" -> 这对我来说没有多大意义,请澄清(在您的问题中添加一些输入/输出示例值)跨度>
  • 添加它,希望这能清除它
  • 嗯,我想我现在明白你的问题了。我会写一个答案。

标签: c# arrays string


【解决方案1】:

您将char 分配给int。由于存在从charint 的隐式对话,您将获得该字符的Unicode 代码(在您的情况下,字符代表数字)。为了解决您问题应该将字符转换为int。 在您的情况下,由于所有字符都是数字,您可以这样做:

map[x, y] = 
   ArrayTest.Properties.Settings.Default.mapSaveSetting.ElementAt(currentposition) - 48;

这是因为符号 [0..9] 的 Unicode 代码是连续的并且等于 [48..57]。

【讨论】:

    【解决方案2】:

    我认为你的错误与字符的 ASCII 值有关。您应该知道每个字符都有一个相关的 ASCII 值,特别是 0 的 ASCII 值是 48149 等等(您可以查看 ASCII 表来检查这一点)。

    因此,要获得正确的字符值,您应该从字符串中的值中减去 char 0 的值,如下面的代码所示。

    map[x, y] = ArrayTest.Properties.Settings.Default.mapSaveSetting.ElementAt(currentposition) - '0';
    

    【讨论】:

      【解决方案3】:

      您正在将 char 值分配给 intchar 设计了一个 Unicode 代码点,它隐式转换为 int,但不是以您期望的方式:它为您提供代码点。

      例子:

      Console.WriteLine((int)'A'); // Will print 65
      

      您实际上是在尝试将表示为字符串的单个数字转换为int。为此使用int.Parse

      Console.WriteLine(int.Parse("5")); // Will print 5
      

      另一个问题:你不应该在string 上使用ElementAt,因为它会不必要地遍历整个字符串直到指定索引,因为string 没有实现IList&lt;char&gt;

      可以这样使用索引器:

      int currentposition = 0;
      var setting = ArrayTest.Properties.Settings.Default.mapSaveSetting;
      
      for (int x = 0; x < 100; x++)
      {
          for (int y = 0; y < 100; y++)
          {
              map[x, y] = int.Parse(setting[currentposition].ToString());
              currentposition++;
          }
      }
      

      但实际上将其中的每个char 转换为新的string 是一种浪费,因此只需使用一些基本的数学运算即可:

      int currentposition = 0;
      var setting = ArrayTest.Properties.Settings.Default.mapSaveSetting;
      
      for (int x = 0; x < 100; x++)
      {
          for (int y = 0; y < 100; y++)
          {
              map[x, y] = setting[currentposition++] - '0';
          }
      }
      

      这是因为数字的代码点是连续的。

      【讨论】:

        【解决方案4】:

        详细说明以前的答案:在 C 和 C++ 中,char 是一个字节(出于所有意图和目的),而在 C# 中它是一个“Unicode”字符。然而,C# 的 'byte' 类型与低级语言的 'char' 类型几乎 1:1 匹配。

        问题表明这可能是问题的一部分。

        另外(性能考虑):需要注意的是,在C#中,数组是一种“重”类型,而多维数组实际上是array-of-arrays。根据使用模式,使用单维数组并手动按行/列大小缩放其中一个索引可能会更有效。就像是: type this[int x, int y] { get { /* 缩放 x/y 之一并从一维数组中读取 */ } }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-12
          • 2012-05-04
          • 1970-01-01
          • 2017-01-22
          • 2017-02-18
          • 2017-03-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多