繁体   English   中英

如何从字符串数组中找到最大数

[英]How to find Maximum Number from a String Array

我有一个名为“代码”的列,该列存储在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。

我应该如何从数组中检索实际最大数量?

如果您只需要最大数量,则可以将查询重写为以下形式:

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

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


为了更详细地说明, SELECT MAX()将仅选择查询的最大值,而CAST([column/value] as [datatype])会将其从一种数据类型转换为[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%确定此表包含数据,并且结果将不为null,请使用this:

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

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

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

您的MCode.Max()调用尝试从MCode数组中获取最大值(顺便说一句,变量应以小写字母开头,而不是大写字母开头)。 问题是,MCode数组不是整数数组,因此返回的最大值不是最大整数,而是最大string 字符串不像整数那样进行比较,因此“ 9”被认为是数组中“最大”的字符串,因此将返回该字符串。 您的MCode应该是一个int数组,而不是一个String数组,这样就可以根据需要对值进行比较,从而获得正确的结果。

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

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

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

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

在使用Max之前将MCode转换为int,这将有所帮助:

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

像这样

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM