【问题标题】:How to find Maximum Number from a String Array如何从字符串数组中找到最大数
【发布时间】:2018-02-02 15:16:42
【问题描述】:

我有一个名为“代码”的列,它存储在 SQL 中的“varchar”数据类型中。 我想从数组中找到最大代码。

所以,当用户想要添加一个新项目时,程序会自动生成新代码。

在 9 号之前它工作得很好。但是当我在代码中添加“10”时,它仍然将“9”号视为最大值。并再次为新项目显示“10”号。

检索字符串数组中的代码列

string commandString = "SELECT Distinct Code FROM Main_Family";
                combobxMCode.Items.Clear();//first clear previous items then refill
                // MessageBox.Show(commandString);
                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);
                sqlCon.Open();
                SqlDataReader dr = sqlCmd.ExecuteReader();
                while (dr.Read())
                {
                    i = 1;
                   // Description = dr["Description"].ToString();
                    combobxMCode.Items.Add(dr[0]);
                    MCode = new string[] {dr["Code"].ToString()};


                }
                dr.Close();

查找最大代码,然后显示新的可用代码

int[] IntCode = Array.ConvertAll(MCode, int.Parse);
        string MaxCode = (MCode.Max()).ToString();
        Next_Code = int.Parse(MaxCode.ToString());
        int show_code = Next_Code + 1;
        combobxMCode.Text = show_code.ToString();

它将最大代码声明为 9。数组中还存在 10 和 11。

我应该如何从数组中检索真正的最大数?

【问题讨论】:

  • 取最长的字符串并排序。
  • 您需要将列值转换为 int。类似stackoverflow.com/a/48239464/2946329
  • 如果您想要一个数字并对其执行数学运算,请将字段设为以数字开头

标签: c# arrays sql-server-2012


【解决方案1】:

如果您只需要最大的数字,那么您可以将查询重写为如下内容:

string commandString = "SELECT MAX(CAST(Code as INT)) FROM Main_Family";

那么您所要做的就是在您的SqlCommand 对象上调用ExecuteScalar() 并将结果转换为int


为了更详细地解释它,SELECT MAX() 将仅选择查询的最大值,而CAST([column/value] as [datatype]) 会将其从一种数据类型转换为[datatype] 中指定的另一种数据类型。

然后你可以猜到,SELECT MAX() 将只返回一个,即最大值,所以你只返回一行一列。这意味着您可以调用 ExecuteScalar() 从结果表的第一行中检索第一个单元格。

由于您已将结果从varchar(n) 转换为int,因此您可以轻松地对ExecuteScalar() 的结果执行相同的操作,从而得到一个整数。


// modified query to get the biggest value
string commandString = "SELECT MAX(CAST(Code as INT)) FROM Main_Family";
combobxMCode.Items.Clear();
SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);
sqlCon.Open();

如果您 100% 确定此表包含数据并且结果不会为空,请使用:

int result = (int)sqlCmd.ExecuteScalar();

但如果表中根本没有值,那么您可能应该进行一些安全检查:

int? result = sqlCmd.ExecuteScalar() as int?;
if(result.HasValue)
{
    return result.Value;
}
return -1;

【讨论】:

  • 但是我没有使用 ExecuteScalar() 我没有使用它就完成了
  • 使用或不使用ExecuteScalar() 由您决定。恕我直言,这是最简单的方法,因为您不必处理 SqlDataReader 而是立即得到结果。
【解决方案2】:

您的MCode.Max() 调用尝试从 MCode 数组中获取最大值(顺便说一下,变量应该以小写字母开头,而不是大写字母)。问题是,MCode 数组不是整数数组,所以返回的最大值不是最大整数,而是最大 string。字符串不像整数那样比较,所以“9”被认为是数组中“最大”的字符串,所以它就是返回的那个。您的 MCode 应该是一个 int 数组而不是 String 数组,以便按照您希望的方式比较这些值,并且您会得到正确的结果。

编辑:现在我重新阅读了您的代码,看来您还在循环的每次迭代中分配了一个新的新数组。如果我没记错的话,打电话

MCode = new string[] {dr["Code"].ToString()};

使得 MCode 永远不会分配超过 1 个值。它只保留最后一个值。您应该改为使用 List 并在循环的每次迭代中添加到它。

此外,正如 m.rogalski 所指出的,还有更有效、更快捷的方式来获取这些信息。

【讨论】:

  • 你能在一些代码的帮助下弄清楚这个吗?
  • 如果我是你,我可能会使用 m.rogalski 的建议
【解决方案3】:

在获取 Max 之前将 MCode 转换为 int,这会有所帮助:

string MaxCode = (MCode.Select(v => int.Parse(v)).Max()).ToString();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    相关资源
    最近更新 更多