2016-10-26 3 views
2

Я использую 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); 

      } 
     } 
    } 
} 

enter image description here

+2

Используйте https://msdn.microsoft.com/en-us/library/system.linq.enumerable.min(v=vs.110).aspx и https://msdn.microsoft.com/en-us /library/system.linq.enumerable.max(v=vs.110).aspx – Aybe

+1

Спасибо всем. Я должен практиковать свои массивы и Linq еще немного :) – taji01

ответ

8

Поняв, что вы хотите, чтобы получить один номер при каждом нажатии кнопки и каждый раз вы хотите, чтобы вычислить Min и Max я предлагаю:

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 операции сбора меди Тион для проверки обновленных значений, но почему делать o(2n), когда вы можете 2x o(n)


Ответ перед тем понимание последний комментарий:

Чтобы справиться с 0 проблемой:

Вы можете использовать Linq Except или проверить, что товар не является 0, когда lookin g для Min и Max, но я бы предложил перейти от int[10] к List<int>. Таким образом у вас не будет этих пустых предметов.

Если это список, то каждый раз при нажатии кнопки:

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(); 

+0

Спасибо за ответ. Я хотел добавить цифры из своего текстового поля, а затем получить минимальное и максимальное значение. – taji01

+0

@ taji01 - см. Последнее обновление –

+0

Благодарим за ответ. Я хотел бы добавить данные в массив каждый раз, когда я нажимаю кнопку из своего текстового поля, затем получаю значение min и max. Например, сначала, если я набираю 2, тогда я нажимаю кнопку, теперь массив удерживает 2. Затем я набираю 5, затем я нажимаю кнопку, теперь массив имеет 2 и 5. Наконец, я набираю 9, затем нажимаю кнопку, теперь массив имеет 2, 5 и 9. Затем я хочу получить данные min и max из массива. – taji01

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 вашему текстовое поле ..

+0

Thanks. Это почти то, что я хотел, но я хотел добавить свои номера один за другим внутри своего текстового поля, а затем получить min и max. – taji01

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.

+1

Основываясь на ваших последних вопросах, я считаю, что пришло время узнать больше о linq. Это облегчает вашу программирование;) –

Смежные вопросы