一千萬個為什麽

搜索

列表中的最大值和最小值

我目前正在做我目前的項目,並且遇到了問題。以下是項目需要做的事情:

從一定的日期範圍內查找最大和最小溫度。日期的範圍將由用戶輸入。

所以,我做一個形式輸入的項目,找到最大和最小的值(無論是在新的形式)的主菜單。我也做一個類來存儲項目:

public class TempDate
{
    public double Temp { get; set; }

    public DateTime Date { get; set; }
}

在第一種形式中,只需將它稱為 FormAddData ,從這裏項目將使用文本框存儲到列表中,以下是代碼:

private void buttonSubmit_Click(object sender, EventArgs e)
    {
        FormMenu formMenu = (FormMenu)this.Owner;

        DateTime date = dateTimePickerDate.Value.Date;
        double temp = double.Parse(textBoxTemp.Text);

        TempDate tempDate = new TempDate();

        tempDate.Date = date;
        tempDate.Temp = temp;

        formMenu.listOfTempDate.Add(tempDate);
        listBoxInfo.Items.Add(date + "\t" + temp + "°C");
    }

在稱為 FormMaxMinRange 的第二種形式中。在這個表單中,我使用了兩個 DateTimePicker ,第一個是開始日期,第二個是結束日期。從這裏開始,我需要制作一個按鈕,選擇從開始和結束日期開始使用的範圍內的所有項目。這是我的代碼:

private void buttonMaxMin_Click(object sender, EventArgs e)
    {
        FormMenu formMenu = (FormMenu)this.Owner;

        DateTime start = dateTimePickerStart.Value.Date;
        DateTime end = dateTimePickerEnd.Value.Date;
        int highest = 0;
        double max = formMenu.listOfTempDate[0].Temp;
        int lowest = 0;
        double min = formMenu.listOfTempDate[0].Temp;

        for (int i = 1; i < formMenu.listOfTempDate.Count; i++)
        {
            if (formMenu.listOfTempDate[i].Date >= start
                && formMenu.listOfTempDate[i].Date <= end)
            {
                if (formMenu.listOfTempDate[i].Temp > max)
                {
                    highest = i;
                    max = formMenu.listOfTempDate[i].Temp;
                }

                if (formMenu.listOfTempDate[i].Temp < min)
                {
                    lowest = i;
                    min = formMenu.listOfTempDate[i].Temp;
                }
            }
        }
        listBoxMaxMin.Items.Add("");
        listBoxMaxMin.Items.Add("Lowest temp: " + min + ", on " + formMenu.listOfTempDate[lowest].Date);
        listBoxMaxMin.Items.Add("Highest temp: " + max + ", on " + formMenu.listOfTempDate[highest].Date);
    }

這裏是我宣布這個類的主要形式(包括列表):

public partial class FormMenu : Form
{
    public List listOfTempDate = new List();

    public FormMenu()
    {
        InitializeComponent();
    }

    private void fromCertainRangeToolStripMenuItem_Click(object sender, EventArgs e)
    {
        FormMaxMinRange formMaxMinRange = new FormMaxMinRange();
        formMaxMinRange.Owner = this;
        formMaxMinRange.ShowDialog();
    }
}

但問題是,在選擇範圍內沒有選擇最小值。另外我希望在列表框中打印最大值和最小值。對於這個漫長而奇怪的問題抱歉。我希望有人能夠理解我對這個問題的意思,以完成我的項目。謝謝。

最佳答案

看到這段代碼片段。 您可以使用Linq選擇縮小列表(使用開始/結束)並按Temp排序。現在您可以輕松選擇第一個(最小)和最後一個(最大)對象。

List loTempDateList = new List()
{
    new TempDate() {Date = DateTime.Now.AddDays(-10), Temp = 10.01 },
    new TempDate() {Date = DateTime.Now.AddDays(-5), Temp = 20.01 },
    new TempDate() {Date = DateTime.Now.AddDays(-3), Temp = 30.01 },
    new TempDate() {Date = DateTime.Now, Temp = 40.01 }
};
DateTime ldStart = DateTime.Now.AddDays(-6);
DateTime ldEnd = DateTime.Now.AddDays(-1);

var loDateList = loTempDateList.Where(item => item.Date <= ldEnd && item.Date >= ldStart)
    .OrderBy(item => item.Temp);

TempDate loMin = loDateList.First();
TempDate loMax = loDateList.Last();

Console.WriteLine("{0}: {1} with max temp", loMax.Date, loMax.Temp);
Console.WriteLine("{0}: {1} with min temp", loMin.Date, loMin.Temp);

輸出(今天):

9/26/2017 3:17:09 PM: 30.01 with max temp
9/24/2017 3:17:09 PM: 20.01 with min temp

更新(使用您的變量名稱):

在表單中將 DateTime end = dateTimePickerEnd.Value.Date; 復制到您的表單中

var loDateList = listOfTempDate.Where(item => item.Date <= end && item.Date >= start)
    .OrderBy(item => item.Temp);

TempDate loMin = loDateList.FirstOrDefault();
TempDate loMax = loDateList.LastOrDefault();

if (loMin != null && loMax !=  null)
{
    listBoxMaxMin.Items.Add("");
    listBoxMaxMin.Items.Add("Lowest temp: " + loMin.Temp + ", on " + loMin.Date);
    listBoxMaxMin.Items.Add("Highest temp: " + loMax.Temp + ", on " + loMax.Date);
}

轉載註明原文: 列表中的最大值和最小值