如何使用索引器来组织课堂教学?

时间:2018-10-28 17:12:47

标签: c# indexer

我的任务: 创建一个尺寸为10个元素的数组,并用任意整数值填充。
打印数组的最大值,数组的最小值,元素的总和,所有元素的平均值,并打印所有奇数。

我的代码:

using System;
using System.Linq;    

namespace Massiv
{
    public class MyMassiv
    {
        private int[] myMassiv = new int[10];
        public int this[int index]
        {
            get
            {
                return myMassiv[index];
            }
            set
            {
                myMassiv[index] = value;
            }
        }
        public int GetMaxElement(MyMassiv massiv)
        {            
            return myMassiv.Max();  
        }

        public int GetMinElement(MyMassiv massiv)
        {
            return myMassiv.Min();
        }

        public int GetSum(MyMassiv massiv)
        {
            return (int)myMassiv.Sum();
        }

        public double GetAverage(MyMassiv massiv)
        {
            return myMassiv.Average();
        }

        public void PrintOddValue(MyMassiv massiv)
        {
            for (int i = 0; i < myMassiv.Length; i++)
            {
                if(myMassiv[i] % 2 != 0)
                    Console.Write(myMassiv[i] + " ");
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyMassiv mm = new MyMassiv();
            Random rnd = new Random();

            int n = 10;
            for (int i = 0; i < n; i++)
            {
                mm[i] = rnd.Next(1000);
                Console.WriteLine("{0} - {1}", i, mm[i]);
            }
            Console.WriteLine("Max: {0}, Min: {1}, Sum: {2}, Average: {3}", mm.GetMaxElement(mm), mm.GetMinElement(mm), mm.GetSum(mm), mm.GetAverage(mm));
            Console.Write("Odd Value: ");
            mm.PrintOddValue(mm);
            Console.ReadKey();
        }        
    }
}

它可以工作,但是我不确定某些设计。例如:“ mm.GetMaxElement(mm)”。这种设计对我来说似乎并不完美。在MyMassiv类中,我正在访问一个私有int [] myMassiv-这样好吗?我的设计错误是什么? 我考虑设计方法,以便什么都不会传递给他们。我在正确的轨道上吗?

1 个答案:

答案 0 :(得分:0)

请查看重构示例:

public class MyMassiv
{
    private int[] _array;
    public int MaxElement => _array.Max();
    public int MinElement => _array.Min();
    public int Sum => _array.Sum();
    public double Average => _array.Average();

    public MyMassiv(int size = 10)
    {
        var rnd = new Random();
        _array = Enumerable.Range(0, size)
            .Select(i => rnd.Next(1000))
            .ToArray();
    }

    public IEnumerable<int> GetOddValues() => _array.Where(item => item % 2 != 0);
}


class Program
{
    static void Main(string[] args)
    {
        MyMassiv mm = new MyMassiv();
        Console.WriteLine(
            "Max: {0}, Min: {1}, Sum: {2}, Average: {3}",
            mm.MaxElement, 
            mm.MinElement, 
            mm.Sum,
            mm.Average);

        Console.Write("Odd Values: ");
        mm.GetOddValues()
           .ToList()
           .ForEach(item => Console.WriteLine(item));

        Console.ReadKey();
    }
}

您可以封装MyMassiv类范围内的所有“逻辑”。 在主要方法中,您只能显示值。 无需将MyMassiv对象传递给方法(就像您的示例中一样)。