【问题标题】:C# Compare 2 strings, sorting, put into arrayC#比较2个字符串,排序,放入数组
【发布时间】:2012-09-15 22:14:40
【问题描述】:

嗨,我现在更好地提出了我的问题。

在 foreach 命令中,我获得了数组中的临时(保存变量)值。我保存在 temp 中的值来自 datagridview 单元格。

在下一步中,在 for 命令中,我想比较 2 个字符串,即第一个字符串和下一个字符串,如果第一个字符串大于第二个字符串,我想更改它们的位置。但是有一个问题,他们不改变位置,他们甚至得到一个空值,我不明白为什么他们得到一个空值。

我认为由于 foreach 命令,它们得到了一个空值,索引 [i] 保持不变,但如果我输入 i = i+1,则该命令将超出范围。

谢谢

秒。尼科

foreach (DataGridViewRow row in dataGridView1.Rows)     
{
    if (row.Cells[i].Value == null)
    {
        //MessageBox.Show("This row is empty");
        break;
    }
    if (row.Cells[i].Value != null)
    {
        temp = row.Cells[i].Value.ToString();
        UnsortArray[i] = temp;
        i = i + 1;

    }
}

for (int a = 0; a < MaxZeilen; a++)
{
    if (i < MaxZeilen)
    {
        *if (String.Compare(UnsortArray[a], UnsortArray[a + 1]) > 0) 
        {
            UnsortArray[a] = temp;
            UnsortArray[a + 1] = temp2;
            temp = UnsortArray[a + 1];
            temp2 = UnsortArray[a];
        }*
    }
}

for (int i = 0; i < MaxZeilen; i++)
{
    UnsortArray[i] = SortArray[i];
    MessageBox.Show(UnsortArray[i]);
}

【问题讨论】:

  • 您想对所有字符串进行排序还是只是交换彼此靠近的字符串?您的代码不会对所有字符串进行排序。 {"22", "33", "11"} 将变为 {"22", "11", "33"}
  • 您确定 UnsortArray 在 foreach 代码之后包含正确的字符串吗?
  • 是的,有人提到对字符串进行排序。但不是用数字,用名字。比如 {"Pepsi" "Cola" "Fanta" "Orangejuice"} 应该变成(字母){"Cola" "Fanta" "Orangejuice" "Pepsi"}。我的导师说它可以用于比较,但我不确定..
  • 请阅读一些关于排序算法的文章en.wikipedia.org/wiki/Sorting_algorithm
  • 并且在您的 foreach 循环中,您从 1 行读取 1 个值,并且每次都是新列。没事吧?

标签: c# arrays string compare bubble-sort


【解决方案1】:

你倒退了,在分配临时变量之前将数组分配给临时变量:

UnsortArray[a] = temp;
UnsortArray[a + 1] = temp2;
temp = UnsortArray[a + 1];
temp2 = UnsortArray[a];

试试:

temp = UnsortArray[a + 1];
temp2 = UnsortArray[a];
UnsortArray[a] = temp;
UnsortArray[a + 1] = temp2;

你又在这里做了一次UnsortArray[i] = SortArray[i];。我想你的意思是SortArray[i] = UnsortArray[i];

【讨论】:

  • 不幸的是它不起作用,没有任何改变 -.- 但谢谢你
  • 好的,我现在明白发生了什么,感谢您的帮助。但问题仍然存在,如您所见,我创建了一个用于显示值的 MessageBox,并且所有框都是空的。所以某事是错误的,我正在进一步搜索!
【解决方案2】:
    temp = UnsortArray[a + 1];    

    UnsortArray[a + 1] = UnsortArray[a];

    UnsortArray[a] = temp;

而不是

          UnsortArray[a] = temp;

          UnsortArray[a + 1] = temp2;

          temp = UnsortArray[a + 1];

          temp2 = UnsortArray[a];

【讨论】:

    【解决方案3】:

    为什么使用数组而不是列表?

    This page 讲述排序列表。

    【讨论】:

      【解决方案4】:

      以下是对您的代码的一些改进。您在顶部有一个错误,可能导致无限循环,只需使用 Array.Sort 方法。如果您希望它以不同的方式排序,请添加一个 IComparable 接口。

      foreach (DataGridViewRow row in dataGridView1.Rows)     
      {
           if (row.Cells[i].Value == null)
           {
                //MessageBox.Show("This row is empty");
                i++;
                break;
           }
           else (row.Cells[i].Value != null)
           {
                UnsortArray[i] = row.Cells[i].Value.ToString();
                i++;
           }
      }  
      
      Array.Sort(UnsortArray);
      SortArray = UnsortArray;
      

      【讨论】:

      • 我不知道array.sort的排序方法。如前所述,我需要创建一个冒泡排序名称排序程序。
      • 与此答案完全无关,只是想给您发消息:回复您的 edit here - 不,这是不正确的:您可以拥有任意数量的 using 语句,只需一组的大括号。代码“按原样”完美编译
      • 谢谢马克。我拿了你的代码并编译了它,它确实编译了。谢谢(你的)信息。我还找到了另一个post,它更详细地解释了这一点。我在 Microsoft 网站上找不到有关此的任何信息。我最初的错误可能是在 using 语句后放了一个分号,而这将 not 编译。
      【解决方案5】:
          List<String> itemList = new List<string>();
          foreach (DataGridViewRow row in dataGridView1.Rows)
          {
              if (row.Cells[0].Value = null)
              {
                  itemList.Add(row.Cells[0].Value.ToString());
              }
          }
      
          itemList.Sort();
          string[] SortedArray = itemList.ToArray();
      
          for (int j = 0; j < SortedArray.Length; j++)
          {
              MessageBox.Show(SortedArray[j]);
          }
      

      如果此代码不起作用,则添加

      foreach(string item in itemList)
      {
          MessageBox.Show(item);
      }
      

      在第一次 foreach 循环后检查值

      【讨论】:

      • if (row.Cells[0].Value == null) ---> itemlist.add code上再次出现null异常问题
      【解决方案6】:

      将其替换为以下代码块

      int i= 0;
      foreach (DataGridViewRow row in dataGridView1.Rows)     
      {
          if (row != null)
          {
              temp = row.ToString();
              UnsortArray[i] = temp;
              i = i + 1;
          }
      }
      
      
      for (int a = 0; a < MaxZeilen; a++)
      {
          if (String.Compare(UnsortArray[a], UnsortArray[a + 1]) > 0) 
          {
              temp = UnsortArray[a + 1];             
              UnsortArray[a + 1] = UnsortArray[a];
              UnsortArray[a] = temp;
          }
      }
      for (int i = 0; i < MaxZeilen; i++)
      {
          MessageBox.Show(UnsortArray[i]);
      }
      

      【讨论】:

      • 我已经尝试过了,但是代码并没有改变任何东西。感谢您的帮助
      • 你有没有注意到我已经删除了外部 if 条件?
      • 是的,我做到了。你的解释对我很有用,我会放弃,但我没有足够的声誉-.-不,它没有帮助,正如已经说过的:&
      • 你是否将 i 的值设置为高于 foreach 循环?
      • 当您比较数据网格中不同列的值时就是这种情况。如果您尝试比较相同列和不同行的值,那么您需要不同的构造。
      【解决方案7】:
      int MaxArrayCount = 0; 
      foreach(DataGridViewRow row in dataGridView1.Rows)    
      { 
      MaxArrayCount += row.Cells.Count;
       }
       string[] UnsortArray= new string[MaxArrayCount];
      
      
      
      int cnt = 0;
      foreach (DataGridViewRow row in dataGridView1.Rows)
                      {
                          for (int i = 0; i < row.Cells.Count; i++ )
                          {
                              if (row.Cells[i].Value != null)
                              {
                                  temp = row.Cells[i].Value.ToString();
      
                                  UnsortArray[cnt] = temp;
      
                                  cnt++;
                              } 
                          }
      
                      }
      
      
      
      for (int b = 1; b < UnsortArray.Count; b++)
      {    
        for (int a = 0; a < UnsortArray.Count - 1; a++)   
           {    
      
          if (String.Compare(UnsortArray[a], UnsortArray[a + 1]) > 0)
           {
      
            temp = UnsortArray[a + 1];
      
            UnsortArray[a + 1] = UnsortArray[a];
      
            UnsortArray[a] = temp;
      
          }    
        }    
      }
      
      
      for (int i = 0; i < MaxZeilen; i++)
      {
      MessageBox.Show(UnsortArray[i]);
      }
      

      【讨论】:

      • No 不起作用,我不知道我多久说一次,我不能 ++cnt,如果我计算 cnt++,我就会越界,为什么没有人理解这一点?谢谢你
      • 你不能超出 cnt++ 的界限,直到你有 UnsortedArray[] 的长度限制,使用: int MaxArrayCount = 0; foreach(dataGridView1.Rows 中的 DataGridViewRow 行){ MaxArrayCount += row.Cells.Count; } 字符串[] UnsortArray= 新字符串[MaxArrayCount];
      • 好吧,你是对的!!!!你解决了,非常感谢!!!!!!!我现在正试图将这些值输入另一个数据网格,有点困难但我很乐观 =) 为他点赞!!!!!! ty
      • 当然,请做,我昨天试过了,但是我的名声太少了
      • 我想现在你有足够的 repo 来将此标记为答案。大声笑我很烦我知道,但仍然:D 你可以吗? D:D:
      猜你喜欢
      • 2012-08-16
      • 2021-06-02
      • 2013-06-06
      • 2019-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多