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文件顶部添加
我建议您使用LinqMax
和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);