List <t>如果它是所有元素的最小值</t>,则仅添加值

时间:2014-06-27 14:49:01

标签: c# list generics

我有以下两个陈述来绘制图表。

public static List<KeyValuePair<int, double>> entries = new List<KeyValuePair<int, double>>();
entries.Add(new KeyValuePair<int, double>(j, min));

我想要的是min值只有在小于或等于列表中的每个其他min值时才会添加到列表中。 怎么能实现这一目标? 感谢。

4 个答案:

答案 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));