2011-09-21 38 views
6

我想存儲諸如使用哪個c#集合來代替List <KeyValuePair <string,double >>?

{ 
{"apple",15 } 
{"pear",12.5 } 
{"", 10  } 
{"", 0.45  } 
} 

的數據將一個線圖上繪製的數據(字符串將是圖例和雙將是的值) 插入順序很重要。 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>

謝謝

+0

stackoverflow通過不轉義某些'<'來殺死我的帖子。所以我最後的評論是如何獲得List 的最大值,並且NameValueCollection是不錯的,但是它的一個我需要一個 frenchone

+0

修復了你的格式。 – Ray

+0

你想要的基本上是一個允許重複鍵的字典。根據這個問題:http://stackoverflow.com/questions/146204/duplicate-keys-in-net-dictionaries框架中沒有任何支持它的東西。您可能需要製作自己的NameValueCollection的通用版本。 –

回答

1

要確定你真正想要哪種數據結構,讓我們看看你的使用模式。

  • 插入訂單事項。
  • 您不能通過密鑰訪問您的項目。
  • 你想要最小和最大。

堆最少提供,但不保留順序。基於哈希的字典也不保存順序。列表實際上是您的數據結構的不錯選擇。它可用並提供出色的支持。

您可以通過爲數據結構和條形數據定義類來美化代碼。您可以將最小/最大功能添加到集合中。注意:我沒有使用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 
    } 
} 
1

你有沒有看LookUp

唯一的問題是它是不可變的,所以你需要能夠一次性創建你的集合。

正如Anthony Pegram指出的那樣,創建一個有點痛苦。這取決於你的數據來自何處。看看ToLookup方法。

+1

問題在於它不是直接可實例化的。你從別的東西開始,然後可以投射到這裏。他首先需要一箇中介結構。 –

+0

是的,這是真的。但是根據他的數據來自何處(沒有提供信息),這仍然是可能的。無論如何,值得了解。 – Ray

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); 
+0

和「插入順序很重要」。... –

+0

對不起,我在閱讀時跳過了*重複*部分。無論如何編輯:) –

+0

這將是一個好主意,只是刪除有關字典的位,而不是讓你的編輯解釋它。封裝類是一個有價值的建議,所以我已經投了答案。 –

1

如果這是值得的可用性(即您使用的尷尬集合List<KeyValuePair<string, double>>無處不在,它可能只是值得推行StringDoubleCollection。它不會是很難與友好包裹底層集合語法,你在你的例子已經說明。

而且,作爲其他的意見/回答所提出的建議,該框架似乎並沒有提供符合您的所有要求一個簡單的解決方案...

至於「最大值「,我假設你是指具有最大價值的鍵值對。它可以像這樣進行檢索:

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

只要定義自己的模型類來保存的,而不是取決於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... 
    } 
} 
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)); 
    } 
} 
相關問題