列表& 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值时才被添加到列表中。如何才能做到这一点?谢谢。

列表& lt; T>只有当它是所有元素中的最小值时才添加值

计算所有条目的最小值,并检查它是否大于您的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));