Найти среднее арифметическое нечётных элементов массива

Имеется массив. Я не особо понимаю как работать foreach, решил записать элементы массива в listbox. А там уже отсеять нечётные элементы. Но не выходит. Прикрепил код. Буду признателен если поможите реализовать и с помощью foreach и как пытался я.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            int e;
            
            this.Text = "Технология LINQ";
            textBox1.Multiline = true;
 
            e = 0;
            
            int[] X = { -2, 5, -23, 0, 7, -10, 11, 11, 14, 3, 8, 5, -5, 27, 8, 7,54 };
            textBox1.Text+="Задача 2. Из заданного массива Х:\r\n\r\n";
            foreach (int x in X)
             
                textBox1.Text = textBox1.Text + x + " ";
            textBox1.Text = textBox1.Text + "\r\n\r\nвыбираем числа, значения" +
                "Которых >=4 и записываем их в список(коллецию) Y, " +
                "исключая элементы-дубликаты:\r\n\r\n";
           
            var Y = from x in X
                    where x!=0 
                    orderby x
                    select x;
             
 
            var Z = Y.Distinct();
           
 
            foreach (var z in Z)
            {
 
 
 
 
                listBox1.Items.Add(z.ToString());
                textBox1.Text = textBox1.Text + z.ToString() + "\r\n ";
                //textBox2.Text = textBox2.Text + z + "\r\n";
               
            }
               
            }            
        
 
        private void Form1_Load(object sender, EventArgs e)
        {
            
            string v;
            
            float sr;
            sr = 0;
            for (int i = 0; i < listBox1.Items.Count && i%2!=0; i++)
            {
                              sr += Convert.ToInt32(listBox1.Items[i]);
               
                
            }
 
                sr = sr / listBox1.Items.Count;
                v = sr.ToString();
                textBox3.Text = v;
          
        }
        
 
        private void textBox2_TextChanged(object sender, EventArgs e)
        {
 
        }
 
        private void textBox3_TextChanged(object sender, EventArgs e)
        {
 
        }
 
        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
 
        }
    }
}
5 ответов

Вот с foreach
    int[] X = { -2, 5, -23, 0, 7, -10, 11, 11, 14, 3, 8, 5, -5, 27, 8, 7,54 };
            ****** summ = 0; //тут будет сумма нечетных элементов
            ****** num = 0;// тут их количество
            foreach (int element in X) { //foreach последовательно присваевает значения из X переменной element
                if (Math.Abs(element)%2==1) {       //проверяем является ли число нечетным
                summ+=element;
                num++;
                }   
            }
            ****** average = summ/num;
Я, кстати не совсем понял, нужно среднее арифметическое нечетных элементов или элементов с нечетным индексом?
            for (int i = 1; i < X.Length; i+=2) {
                summ+=X[i];
                num++;
            }
            average = summ/num;


С нечётным индексом ) Большое спасибо, очень признателенЯ так понял в вашем примере считается, просто нечётные элементы, а не индексы?


В первом да, считаются сами нечетные элементы. Во втором элементы с нечетным индексом, там foreach не нужен, т.к. он проходится по всем элементам, а тут нужно через 1.


А нельзя ли как-нибудь ограничить именно через foreach? Или в любом случае будет проходить по каждому элементу?


А нельзя ли как-нибудь ограничить именно через foreach? Или в любом случае будет проходить по каждому элементу?
Можно сказать что в "В любом случае." но это относится только к стандартным коллекциям массивам итд.Если конечно напишете свой собственный класс "массив" и в реализации IEnumerator не укажите другое Но зачем писать костыль если и так всё отлично?