从数组中获取最大和最小的数字

时间:2016-10-26 16:42:15

标签: c# .net arrays winforms

我正在使用WinForms。起初我很难将文本框中的数据添加到数组中,但我想出来了,但我不知道这是否是理想的方法。接下来,我要做的是获取数组中最大的数字和数组中除零之外的最小数字。在我的例子中,我键入了2,5,8,7,6 7.对于这个例子,我的目标是得到数字2和7。除了0之外,2是数组中的最小数字,而7是数组中最大的数字

到目前为止,我有这个。

private const int MAX_ITEMS = 10;
private int[] numArray = new int[MAX_ITEMS];
private int index = 0;

private void Add_Data_Btn_Click(object sender, EventArgs e)
{
    if (this.index < numArray.GetUpperBound(0))
    {
        int dnum;
        if (int.TryParse(i_richTextBox1.Text, out dnum))
        {
            numArray[this.index++] = dnum;
            i_richTextBox1.Text = "";
        }

        if (Value_Out_Array_CheckBx.Checked == true)
        {
            foreach (var item in numArray)
            {
                Console.WriteLine(item);

            }
        }
    }
}

enter image description here

3 个答案:

答案 0 :(得分:8)

在了解了您想要的是每次按下按钮时获得一个号码,并且每次您想要计算最小值和最大值我建议:< / p>

private List<int> _numbers = new List<int>(); // Use List<int> to avoid having irrelevant 0 items

private int _min;
private int _max;

private void Add_Data_Btn_Click(object sender, EventArgs e)
{
    //Parse and add new number to collection (notice - this does not take care of invalid input..
    var number = int.Parse(i_richTextBox1.Text);

    // If it is the first time iterating then this number is both the _min and _max
    if(_numbers.Count == 0)
    {
        _min = number;
        _max = number;
    }
    else
    {
        //Check if need to update _min or _max
        if(number < _min)
            _min = number;
        else if(number > max)
            _max = number;
    }

    _numbers.Add(number);
}

当然,您仍然可以对集合使用linq .MinMax操作来检查更新的值,但为什么o(2n)可以2x o(n) }

之前回答了解最新评论:

  

处理0问题:

您可以使用Linq Except或在查找Min和Max时检查该项目是否为0,但我建议您从int[10]更改为{{1} - 那样你就不会有那些空的物品了。

如果是列表,则每按一次按钮:

List<int>
  

获得最小和最大:

使用linq:

private void Add_Data_Btn_Click(object sender, EventArgs e)
{
    numberList.Add(int.Parse(i_richTextBox1.Text));
}

或者,如果您想在List<int> numbers = new List<int> {2, 5, 8, 7, 6 7}; var min = numbers.Min(); var max = numbers.Max(); 而不是o(n)中执行此操作:

o(2n)
  

改变获得数字的方式:

如果您想更改从List<int> numbers = new List<int> {2, 5, 8, 7, 6 7}; int min = numbers[0]; int max = numbers[0]; foreach(item in numbers) { if(item > max) max = item; else if(item < min) min = item; } 获取数据的方式并立即全部获取(而不是一次只能获取一个数字),请使用TextBox

string.Split

答案 1 :(得分:1)

而不是逐个获取数字,您可以一次读取所有数字。并使用Regex和Linq

var numbers = Regex.Matches(i_richTextBox1.Text, @"\d+")
                .Cast<Match>()
                .Select(m=>int.Parse(m.Value))
                .ToArray();
var min = numbers.Min();
var max = numbers.Max();

例如,在文本框中输入2 3 4 61 7 12 ..

答案 2 :(得分:1)

由于您希望获得除0之外的最小值,因此您可以使用:

var min = numArray.Except(new int[] { 0 }).Min();

var min = numArray.Where(x => x != 0).Min();

如吉拉德所提到的最大值:

var max = numArray.Max();

如果InvalidOperationException不包含Sequence contains no elements的元素,请注意numArray 0 {。}}。