【问题标题】:Get the largest and smallest number from a array从数组中获取最大和最小的数
【发布时间】:2016-10-26 16:42:14
【问题描述】:

我正在使用WinForms。起初我很难将文本框中的数据添加到数组中,但我想通了,但我不知道这是否是理想的方法。接下来,我要做的是获取数组中的最大数和数组中除零之外的最小数。在我的示例中,我输入了 2、5、8、7、6 7。在此示例中,我的目标是找回数字 2 和 7。 2是数组中除0之外的最小数,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);

            }
        }
    }
}

【问题讨论】:

标签: c# .net arrays winforms


【解决方案1】:

在了解您想要在每次按下按钮时获得一个数字并且每次您想要计算我建议的最小值和最大值之后:

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 .Min 和 Max 操作来检查更新的值,但是当您可以 2x o(n) 时,为什么还要使用 o(2n)


回答之前了解最新评论:

处理0问题:

您可以使用 Linq Except 或在查找 Min 和 Max 时检查该项目不是 0,但我只是建议从 int[10] 更改为 List&lt;int&gt; - 这样你就赢了'没有那些空项目。

如果是列表,那么每次按下按钮:

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

获取最小值和最大值:

使用 linq:

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:

string data = "2 5 8 7 6 7";
var numbers = data.Split(' ')
                  .Select(int.Parse).ToList();

// Or if you might have more spaces:
string data = "2  5 8 7   6 7";
var numbers = data.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries)
                  .Select(int.Parse).ToList();

【讨论】:

  • 感谢您的回复。我想从我的文本框中添加数字,然后获取最小值和最大值。
  • 感谢您的回复。每次单击文本框中的按钮时,我都想将数据添加到数组中,然后获取最小值和最大值。例如,首先如果我输入 2,然后我单击按钮,现在数组包含 2。然后我输入 5,然后我单击按钮,现在数组包含 2 和 5。最后,我输入 9,然后我单击按钮,现在数组包含 2、5 和 9。然后我想从数组中获取最小和最大数据。
  • @taji01 - 等等 - 你想在每次按下时都得到一个数字吗?您是否希望每次都计算新的最小值和最大值?
  • 是的,这就是我要找的 :)
【解决方案2】:

您可以一次读取所有数字,而不是一个一个地获取数字。并使用正则表达式和 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..

【讨论】:

  • 谢谢。这几乎是我想要的,但我想在我的文本框中一个一个地添加我的数字,然后得到最小值和最大值。
【解决方案3】:

既然你想得到除0之外的最小值,你可以使用:

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

或

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

正如 Gilad 所提到的,最大限度地:

var max = numArray.Max();

注意InvalidOperationException 说Sequence contains no elements,如果numArray 不包含仅0 的元素。

【讨论】:

  • 根据您最近的问题,我相信是时候了解更多有关 linq 的信息了。它使您的编程生活更轻松;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 2011-08-16
  • 2017-12-13
相关资源
最近更新 更多