要使用哪个c#集合而不是List <keyvaluepair <string,double =“”>&gt;?</keyvaluepair <string,>

时间:2011-09-21 17:01:16

标签: c# data-structures collections

我想存储

等数据
{
 {"apple",15   }
 {"pear",12.5  }
 {"", 10       }
 {"", 0.45     }
}

数据将绘制在条形图上(字符串将是图例,double将是值) 插入顺序很重要。 Perfs并不重要。 字符串可以重复或为空。(值也可以重复)

我需要获得最小值和最大值(如果可能的话,很容易)来设置比例。

我用

List<KeyValuePair<string, double>> data = new List<KeyValuePair<string, double>>();
data.Add(new KeyValuePair<string,double>("",i));

相当无聊和难以理解。 有更清洁的方法吗?

StringDoubleCollection data = new StringDoubleCollection();
data.add("apple",15);
data.add("",10);

double max = data.values.Max(); 
double min = data.values.Min();

如果不是如何在没有太多麻烦的情况下获得List<KeyValuePair<string, double>>的最大值

NameValueCollection看起来不错,但<string,string>我需要一个<string,double>

谢谢

6 个答案:

答案 0 :(得分:5)

您可以创建如下所示的类:

class X
{
     public string Name { get; set; }
     public double Value { get; set; }

     // name is an optional parameter (this means it can be used only in C# 4)
     public X(double value, string name = "")
     {
         this.Name = name;
         this.Value = value;
     }

     // whatever
}

然后使用带有选择器的LINQ获取最大值和最小值:

var data = new List<X>();
data.Add(new X(35.0, "Apple"))
data.Add(new X(50.0));

double max = data.Max(a => a.Value);
double min = data.Min(a => a.Value);

编辑:如果您上面的代码似乎仍然无法读取,请尝试使用运算符对您希望仅拥有该值的情况进行改进。

// Inside X class...
public static implicit operator X(double d)
{
    return new X(d);
}

// Somewhere else...
data.Add(50.0);

答案 1 :(得分:1)

你看过LookUp吗?

唯一的问题是它是不可变的,所以你需要能够一次性创建你的收藏。

正如Anthony Pegram所说,创造一个人有点痛苦。这取决于您的数据来自何处。看看ToLookup方法。

答案 2 :(得分:1)

如果它对于可用性是值得的(即你在任何地方使用List<KeyValuePair<string, double>>的笨拙集合,那么实现StringDoubleCollection可能是值得的。包装底层证据并不困难使用您在示例中描述的更友好的语法进行集合。

而且,正如其他评论/答案所暗示的那样,框架似乎没有提供符合您所有要求的更简单的解决方案......

对于“最大值”,我假设您指的是具有最大值的键值对。它可以像这样检索:

var max = list.Select(kvp => kvp.Value).Max();

答案 3 :(得分:1)

只需定义您自己的模型类来保存数据,而不是依赖于KeyValuePair,一切都变得更清晰:

using System;
using System.Collections.Generic;

public class Fruit
{
    public string Name {get; set;}
    public double Price {get; set;}
}

public class Program
{
    public static void Main()
    {
        List<Fruit> _myFruit = new List<Fruit>();

        _myFruit.Add(new Fruit{Name="apple", Price=15   });
        _myFruit.Add(new Fruit{Name="pear", Price=12.5  });
        _myFruit.Add(new Fruit{Name="",  Price=10       });
        _myFruit.Add(new Fruit{Name="",  Price=0.45     });

        // etc...
    }
}

答案 4 :(得分:1)

要确定您真正想要的数据结构,请查看您的使用模式。

  • 插入订单事宜。
  • 您不能通过密钥访问您的商品。
  • 你想要最小和最大。

堆提供min max,但不保留顺序。基于哈希的字典也不保留顺序。 List实际上是您数据结构的不错选择。它可用并提供出色的支持。

您可以通过为数据结构和条形数据定义类来美化您的代码。您可以为集合添加最小/最大功能。注意:我没有使用Linq Min / Max函数,因为它们返回最小,而不是最小元素

public class BarGraphData {
    public string Legend { get; set; }
    public double Value { get; set; }
}

public class BarGraphDataCollection : List<BarGraphData> {
    // add necessary constructors, if any

    public BarGraphData Min() {
        BarGraphData min = null;
        // finds the minmum item
        // prefers the item with the lowest index
        foreach (BarGraphData item in this) {
            if ( min == null )
                min = item;
            else if ( item.Value < min.Value )
                min = item;
        }
        if ( min == null )
            throw new InvalidOperationException("The list is empty.");
        return min;
    }

    public BarGraphData Max() {
        // similar implementation as Min
    }
}

答案 5 :(得分:0)

如何实现StringDoubleCollection以使其工作...

public class StringDoubleCollection
{
    private List<KeyValuePair<string, double>> myValues;
    public List<double> values
    {
        get { return myValues.Select(keyValuePair => keyValuePair.Value).ToList(); }
    }

    public void add(string key, double value)
    {
        myValues.Add(new KeyValuePair<string,double>(key,value));
    }
}