我有以下两个陈述来绘制图表。
public static List<KeyValuePair<int, double>> entries = new List<KeyValuePair<int, double>>();
entries.Add(new KeyValuePair<int, double>(j, min));
我想要的是min
值只有在小于或等于列表中的每个其他min
值时才会添加到列表中。
怎么能实现这一目标?
感谢。
答案 0 :(得分:5)
只需计算所有条目的最小值,并检查它是否大于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; }
}
}
答案 1 :(得分:2)
使用Enumerable.Min计算最小值,然后将其与当前值进行比较,如:
var minValue = entries.Min(r => r.Value);
if (min <= minValue)
{
entries.Add(new KeyValuePair<int, double>(j, min));
}
答案 2 :(得分:2)
如果表现很重要,你应该使用它:
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);
}
}
}
答案 3 :(得分:1)
您可以创建一个覆盖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));