簡體   English   中英

列表中的最大值和最小值

[英]maximum and minimum value in list

我目前正在執行當前的項目,但遇到了問題。 這是項目需要做的事情:

找到某個日期范圍內的最高和最低溫度。 日期范圍將由用戶輸入。

因此,我將一個表單作為輸入項目並查找最大值和最小值(均為新表單)的主菜單。 我還開設了一個課程來存儲項目:

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<TempDate> listOfTempDate = new List<TempDate>();

    public FormMenu()
    {
        InitializeComponent();
    }

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

但是,問題是,未在選擇范圍內選擇最小值。 我也希望最大值和最小值被打印在列表框中。 很抱歉這個長期而奇怪的問題。 我希望有人能夠理解我對這個問題的理解以完成我的項目。 謝謝。

請參見此代碼段。 您可以使用Linq選擇簡化列表(帶有“開始/結束日期”),並按“臨時”順序對其進行排序。 現在,您可以輕松選擇第一個(最小)和最后一個(最大)對象。

List<TempDate> loTempDateList = new List<TempDate>()
{
    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);
}

我建議您使用Linq MaxMin方法。

// filter out only the dates in the range you need
var items = formMenu.listOfTempDateWhere(
    item => ((TempDate)item).Date >= start && ((TempDate)item).Date <= end
);

// get the maximum value
var max = items.Max(item => item.Temp);
// get the minimum value
var min = items.Min(item => item.Temp);

只需記住在.cs文件頂部using System.Linq添加即可


在線嘗試

如果您不喜歡LINQ方法(出於某些可能無效的原因,我從不使用LINQ,我認為這很邪惡),則可以覆蓋List類並使用您自己的方法進行擴展。

public class TempDataList<T> : List<TempData>
{
    public TempDataList() : base()
    {
    }

    public TempDataList(IEnumerable<TempData> collection) : base(collection)
    {
    }

    public TempData GetMaxTemp(DateTime startDate, DateTime endDate)
    {
        TempData highestTempData = null;
        for (int i = 0; i < this.Count; i++)
        {
            if (this[i].Date >= startDate && this[i].Date <= endDate)
            {
                if (highestTempData == null || this[i].Temp > highestTempData.Temp)
                {
                    highestTempData = this[i];
                } 
            }
        }
        return highestTempData;
    }

    public TempData GetMinTemp(DateTime startDate, DateTime endDate)
    {
        TempData lowestTempData = null;
        for (int i = 0; i < this.Count; i++)
        {
            if (this[i].Date >= startDate && this[i].Date <= endDate)
            {
                if (lowestTempData == null || this[i].Temp < lowestTempData.Temp)
                {
                    lowestTempData = this[i];
                }
            }
        }
        return lowestTempData;
    }
}

並填寫擴展列表並調用方法:

TempDataList<TempData> tempDataList = new TempDataList<TempData>();
tempDataList.Add(new TempData(10, DateTime.UtcNow));
tempDataList.Add(new TempData(20, DateTime.UtcNow));
tempDataList.Add(new TempData(15, DateTime.MinValue));
tempDataList.Add(new TempData(25, DateTime.MaxValue));

Console.WriteLine(tempDataList.GetMaxTemp(DateTime.UtcNow.AddDays(-1), DateTime.UtcNow.AddDays(1)).Temp);
Console.WriteLine(tempDataList.GetMinTemp(DateTime.UtcNow.AddDays(-1), DateTime.UtcNow.AddDays(1)).Temp);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM