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

时间:2018-02-02 06:56:11

标签: c# arrays sql-server-2012

我有一个名为'Code'的列,它存储在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。

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

3 个答案:

答案 0 :(得分:4)

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

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

然后,您只需在ExecuteScalar()对象上调用SqlCommand,然后将结果投放到int

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

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

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

// 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,请使用此命令:

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

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

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

答案 1 :(得分:1)

您的MCode.Max()调用尝试从MCode数组中获取最大值(顺便说一句,变量应以小写字母开头,而不是大写字母)。问题是,MCode数组不是整数数组,因此返回的最大值不是最大整数,而是最大字符串。字符串不像整数那样进行比较,所以&#34; 9&#34;被认为是最大的&#34;数组中的字符串,因此返回的字符串。你的MCode应该是一个int数组而不是一个String数组,这样就可以按照你想要的那样比较这些值,并得到正确的结果。

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

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

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

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

答案 2 :(得分:0)

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

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

Like this