Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列表中的最大值和最小值_C#_Winforms - Fatal编程技术网

C# 列表中的最大值和最小值

C# 列表中的最大值和最小值,c#,winforms,C#,Winforms,我目前正在做我目前的项目,我有一个问题。以下是项目需要做的事情: 找出某一日期范围内的最高和最低温度。日期的范围将由用户输入 因此,我制作了一个表单作为主菜单,用于输入项目并查找最大值和最小值(都在新表单中)。我还创建了一个类来存储项目: public class TempDate { public double Temp { get; set; } public DateTime Date { get; set; } } 在第一种形式中,只需将其称为FormAddData,

我目前正在做我目前的项目,我有一个问题。以下是项目需要做的事情:

找出某一日期范围内的最高和最低温度。日期的范围将由用户输入

因此,我制作了一个表单作为主菜单,用于输入项目并查找最大值和最小值(都在新表单中)。我还创建了一个类来存储项目:

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
。在这个表单中,我使用了两个日期时间选择器,第一个用于开始日期,第二个用于结束日期。从这里我需要做一个按钮,将选择所有项目的范围,我使用的开始和结束日期。这是我的密码:

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);
    }
private void按钮单击(对象发送者,事件参数e)
{
FormMenu FormMenu=(FormMenu)this.Owner;
DateTime start=dateTimePickerStart.Value.Date;
DateTime end=dateTimePickerEnd.Value.Date;
int最高=0;
double max=formMenu.listOfTempDate[0].Temp;
int最低=0;
double min=formMenu.listOfTempDate[0].Temp;
for(int i=1;i=开始
&&formMenu.listOfTempDate[i].最大日期)
{
最高=i;
max=formMenu.listOfTempDate[i].Temp;
}
if(formMenu.listOfTempDate[i].Temp
下面是我声明类的主要表单(包括列表):

公共部分类表单菜单:表单
{
public List listOfTempDate=新列表();
公共表单菜单()
{
初始化组件();
}
来自CertainRangeToolStripMenuItem\u单击的私有无效(对象发送者,事件参数e)
{
FormMaxMinRange FormMaxMinRange=新FormMaxMinRange();
formMaxMinRange.Owner=此;
formMaxMinRange.ShowDialog();
}
}

但是,问题是,未在选择范围内选择最小值。我还希望最大值和最小值打印在列表框中。抱歉问了这么长又奇怪的问题。我希望有人能理解我这个问题的意思,以完成我的项目。谢谢。

我建议您使用Linq
Max
Min
方法

// 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);
//只筛选出所需范围内的日期
var items=formMenu.listOfTempDateWhere(
item=>((TempDate)item.Date>=开始和((TempDate)item.Date item.Temp);
//获取最小值
var min=items.min(item=>item.Temp);
只需记住使用System.Linq在.cs文件顶部添加



我建议您使用Linq
Max
Min
方法

// 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);
//只筛选出所需范围内的日期
var items=formMenu.listOfTempDateWhere(
item=>((TempDate)item.Date>=开始和((TempDate)item.Date item.Temp);
//获取最小值
var min=items.min(item=>item.Temp);
只需记住使用System.Linq在.cs文件顶部添加


请参阅此代码片段。 您可以使用Linq选择缩减列表(带开始/结束日期)并按温度排序。现在可以轻松选择第一个(最小)和最后一个(最大)对象

更新(使用变量名):

将其复制到
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);
}
var loDateList=listOfTempDate.Where(item=>item.Date=start)
.OrderBy(项目=>item.Temp);
TempDate loMin=loDateList.FirstOrDefault();
TempDate loMax=loDateList.LastOrDefault();
if(loMin!=null&&loMax!=null)
{
listBoxMaxMin.Items.Add(“”);
listBoxMaxMin.Items.Add(“最低温度:+loMin.temp+”,在“+loMin.Date”);
listBoxMaxMin.Items.Add(“最高温度:+loMax.temp+”,在“+loMax.Date”);
}
请参阅此代码片段。 您可以使用Linq选择缩减列表(带开始/结束日期)并按温度排序。现在可以轻松选择第一个(最小)和最后一个(最大)对象

更新(使用变量名):

将其复制到
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);
}
var loDateList=listOfTempDate.Where(item=>item.Date=start)
.OrderBy(项目=>item.Temp);
TempDate loMin=loDateList.FirstOrDefault();
TempDate loMax=loDateList.LastOrDefault();
if(loMin!=null&&loMax!=null)
{
listBoxMaxMin.Items.Add(“”);
listBoxMaxMin.Items.Add(“最低温度:+loMin.temp+”,在“+loMin.Date”);
listBoxMaxMin.Items.Add(“最高温度:+loMax.temp+”,在“+loMax.Date”);
}

如果您不喜欢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:List
{
public TempDataList():base()
{
}
公共临时数据列表(IEnumerable集合):基本(集合)
{
}
public TempData GetMaxTemp(日期时间开始日期、日期时间结束日期)
{
TempData highestTempData=null;
for(int i=0;i=startDate&&this[i].Date highestTempData.Temp)
{
highestTempData=此[i];
} 
}
}
返回高
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);