C# - 涉及数组的方法难度大

时间:2015-04-04 17:34:12

标签: c#

我正在创建一个程序,可以在不同的日子里向中心提取访问次数信息。我正在使用数组来跟踪该信息,但我还需要创建一个方法,以最少的访问次数调用当天,然后将其显示在输出中。

class ScienceCentreVisitation
{
    private string centreName;
    private string city;
    private decimal ticketPrice;
    private string[] visitDate;
    private int[] adultVisitors;
    private decimal[] totalRevenue;


    //constructors
    public ScienceCentreVisitation()
    {

    }

    public ScienceCentreVisitation(string cent)
    {
        centreName = cent;
    }

    public ScienceCentreVisitation(string cent, string cit, decimal price, string[] date, int[] visit, decimal[] rev)
    {
        visitDate = new string[date.Length];
        adultVisitors = new int[visit.Length];
        totalRevenue = new decimal[rev.Length];
        Array.Copy(date, 0, visitDate, 0, date.Length);
        Array.Copy(visit, 0, adultVisitors, 0, adultVisitors.Length);
        Array.Copy(rev, 0, totalRevenue, 0, rev.Length);
        centreName = cent;
        city = cit;
        ticketPrice = price;
    }

    //properties
    public string CentreName
    {
        get
        {
            return centreName;
        }
        set
        {
            centreName = value;
        }
    }

    public string City
    {
        get
        {
            return city;
        }
        set
        {
            city = value;
        }
    }

    public decimal TicketPrice
    {
        get
        {
            return ticketPrice;
        }
        set
        {
            ticketPrice = value;
        }
    }

    public string[] VisitDate
    {
        get
        {
            return visitDate;
        }
        set
        {
            visitDate = value;
        }
    }

    public int[] AdultVisitors
    {
        get
        {
            return adultVisitors;
        }
        set
        {
            adultVisitors = value;
        }
    }

    public decimal[] TotalRevenue
    {
        get
        {
            return totalRevenue;
        }
        set
        {
            totalRevenue = value;
        }
    }

    //methods
    public decimal CalculateTotalRevenue()
    {
        decimal totalRev;

        int cntOfValidEntries;
        int total = 0;
        foreach (int c in adultVisitors)
            total += c;
        cntOfValidEntries = TestForZeros();
        totalRev = (decimal)total / cntOfValidEntries;
        return totalRev;
    }

    public int TestForZeros()
    {
        int numberOfTrueVisits = 0;
        foreach (int cnt in adultVisitors)
            if (cnt != 0)
                numberOfTrueVisits++;
        return numberOfTrueVisits;
    }

    public int GetIndexOfLeastVisited()
    {
        int minVisIndex = 0;

        for (int i = 1; i < adultVisitors.Length; i++)
            if (adultVisitors[i] < adultVisitors[minVisIndex])
                minVisIndex = i;
        return minVisIndex;
    }

    public int GetLeastVisited()
    {
        return adultVisitors[GetIndexOfLeastVisited()];
    }

    public string GetDateWithLeastVisited()
    {
        return visitDate[GetIndexOfLeastVisited()];
    }

    public int GetIndexOfMostRevenue()
    {
        int maxRevIndex = 0;

        for (int i = 1; i < totalRevenue.Length; i++)
            if (totalRevenue[i] > totalRevenue[maxRevIndex])
                maxRevIndex = i;
        return maxRevIndex;
    }

    public decimal GetMostRevenue()
    {
        return totalRevenue[GetIndexOfMostRevenue()];
    }

    public string GetDateWithMostRevenue()
    {
        return visitDate[GetIndexOfMostRevenue()];
    }

    public override string ToString()
    {
        return "Name of Centre: " + centreName +
               "\nCity: " + city +
               "\n Price of ticket: " + ticketPrice +
                "\nDate of Least One-Day Adult Visitors:\t\t" + GetDateWithLeastVisited() +
                "\nNumber of Least One-Day Adult Visitors:\t\t" + GetLeastVisited() +
                "\nDate of Most Total Revenue Collected:\t\t" + GetDateWithMostRevenue() +
                "\nHighest Total Revenue Collected:\t\t" + GetMostRevenue();
    }
}

其他课程:

class ScienceCentreApp
{
    static void Main(string[] args)
    {
        string centreName;
        string city;
        decimal ticketPrice = 0;
        int visitorCnt;
        string[] dArray = new String[5];
        int[] adultVisitors = new int[5];
        decimal[] totalRevenue = new decimal[5];
        char enterMoreData = 'Y';
        ScienceCentreVisitation scv;


        do
        {
            visitorCnt = GetData(out centreName, out city, out ticketPrice, dArray, adultVisitors, totalRevenue);
            scv = new ScienceCentreVisitation(centreName, city, ticketPrice, dArray, adultVisitors, totalRevenue);
            Console.Clear();
            Console.WriteLine(scv);

            Console.Write("\n\n\n\nDo you want to enter more data - " +
                          "(Enter y or n)? ");
            if (char.TryParse(Console.ReadLine(), out enterMoreData) == false)
                Console.WriteLine("Invalid data entered - " +
                                    "No recorded for your respones");
        } while (enterMoreData == 'y' || enterMoreData == 'y');

        Console.ReadKey();
    }

    public static int GetData(out string centreName, out string city, out decimal ticketPrice, string[] dArray, int[] adultVisitors, decimal[] totalRevenue)
    {
        int i,
            loopCnt;

        Console.Clear();
        Console.Write("Name of Centre: ");
        centreName = Console.ReadLine();
        Console.Write("City: ");
        city = Console.ReadLine();
        Console.Write("Ticket Price: ");
        string inValue = Console.ReadLine();
        ticketPrice = Convert.ToDecimal(inValue);

        Console.Write("How many records for {0}? ", centreName);
        string inValue1 = Console.ReadLine();
        if (int.TryParse(inValue1, out loopCnt) == false)
            Console.WriteLine("Invalid data entered - " +
                                "0 recorded for number of records");
        for (i = 0; i < loopCnt; i++)
        {
            Console.Write("\nDate (mm/dd/yyyy): ");
            dArray[i] = Console.ReadLine();
            if (dArray[i] == "")
            {
                Console.WriteLine("No date entered - " +
                                    "Unknown recorded for visits");
                dArray[i] = "Unknown";
            }
            Console.Write("Number of One-Day Adult Visitors: ");
            inValue1 = Console.ReadLine();
            if (int.TryParse(inValue1, out adultVisitors[i]) == false)
                Console.WriteLine("Invalid data entered - " +
                                    "0 recorded for adults visited");
        }
        return i;
    }
}

在我对程序进行一些更改之前,我已经将它工作了,但现在它在我运行它时一直空白。知道为什么吗?

1 个答案:

答案 0 :(得分:0)

如果没有完整的代码,很难为您调试。

但是当我在阅读你问题的开头时,这是一个提出的建议:
似乎基本的要点是使用Dictionary<DateTime, int>来存储每天的访问次数。

然后您可以使用简单的LINQ查询来获得最小的值:
dictionary.OrderBy(kvp => kvp.Value).First()

当然,您可以使用复杂的类代替int并存储更多数据(当天的地点,入场费,成人访问费等)。

class CenterVisitations
{
  internal int Visitations { get; set; }
  internal decimal TicketPrice { get; set; }
  internal string Location { get; set; }
  //add other stuff here, possibly create another class
  //to store TicketPrice, Location and other static center data
  //and create a reference to that here, instead of the above 
  //TicketPrice and Location...
}

然后你可以这样定义你的字典:
Dictionary<DateTime, CenterVisitations>

查询它与上次几乎相同:
dictionary.Order(kvp => kvp.Value.Visitations).First();

排序和选择将以相同的方式工作。此外,您可以添加.Where查询来设置要检查的日期范围:
dictionary.Where(kvp => kvp.Key < DateTime.Today && kvp.Key > DateTime.Today.AddDays(-7))只会查找最后几周的数据。

您似乎也将数据保存在单独的数组中,这意味着查询它要困难得多。最后,考虑将日期转换为DateTime个对象而不是字符串。