[英]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指出的那样,还有更有效,更快捷的方式来获取此信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.