列表& lt; T>只有当它是所有元素中的最小值时才添加值
本文关键字:元素 最小值 添加 lt 列表 | 更新日期: 2023-09-27 18:10:28
我有下面两个语句来绘制图表。
public static List<KeyValuePair<int, double>> entries = new List<KeyValuePair<int, double>>();
entries.Add(new KeyValuePair<int, double>(j, min));
我想要的是,min
值只有在小于或等于列表中的所有其他min
值时才被添加到列表中。如何才能做到这一点?谢谢。
计算所有条目的最小值,并检查它是否大于您的min
值:
if (!entries.Any() || min <= entries.Min(e => e.Value))
entries.Add(new KeyValuePair<int, double>(j, min));
更新:在尝试查找最小值之前,您还需要检查条目列表中是否有元素。
提示:如果你总是使用这个规则来添加项目,并且不以其他方式修改集合(即删除项目或在某些索引处插入),那么你可以简单地检查最后一个项目的值-它总是小于或等于其他值。
更新:您可以为属性和类本身(您可以考虑更好的名称)创建具有描述性名称的自定义类,而不是为您的数据使用KeyValuePair:
public class Point
{
public Point(int iteration, double value)
{
Iteration = iteration;
Value = value;
}
public int Iteration { get; private set; }
public double Value { get; private set; }
}
然后创建一个类来封装点和与这些点相关的行为。从你的描述可以是这样的:
public class DecresingGraph
{
private List<Point> points = new List<Point>();
public void Add(Point point)
{
if (!points.Any())
{
points.Add(point);
return;
}
if (point.Value <= points.Last().Value)
points.Add(point);
}
public IEnumerable<Point> Points
{
get { return points; }
}
}
使用Enumerable。Min计算最小值,然后将其与当前值进行比较,例如:
var minValue = entries.Min(r => r.Value);
if (min <= minValue)
{
entries.Add(new KeyValuePair<int, double>(j, min));
}
如果性能很重要,你应该使用这个代替:
public class MinFloatKeyValuePairList : Collection<KeyValuePair<int, float>>
{
private float _lowest = float.MaxValue;
protected override void InsertItem(int index, KeyValuePair<int, float> item)
{
if (item.Value <= _lowest || this.Count == 0)
{
_lowest = item.Value;
base.InsertItem(index, item);
}
}
}
您可以创建一个覆盖InsertItem的集合
public class YourCollection : Collection<KeyValuePair<int, double>>
{
protected override void InsertItem(int index, KeyValuePair<int, double> item)
{
if (!this.Any() || item.Value <= this.Min(e => e.Value))
base.InsertItem(index, item);
}
}
然后您只需将您的项目添加到集合中,如果符合您的要求,该项目将被添加到列表中。
YourCollection collection = new YourCollection();
collection.Add(new KeyValuePair<int, double>(j, min));