2013-02-23 41 views
1

我有一个包含产品名称及对应的价格为Dictionary对象是这样的:是使用字典正确存储产品信息和应用的计算

  var products = new List<Dictionary<string, decimal>>() 
      { 
       new Dictionary<string, decimal> {{"product1", 10}}, 
       new Dictionary<string, decimal> {{"product2", 20}}, 
       new Dictionary<string, decimal> {{"product3", 30}} 
      }; 

我再通过这个循环和应用单位产品计算一下:

 foreach (var product in products) 
     { 
      foreach (KeyValuePair<string, decimal> kvp in product) 
      { 
       var result = GetRatePerProduct(kvp.Key) * kvp.Value;   
      } 
     } 

GetRatePerProduct只需要产品名并返回一个十进制数。

基于这种循环的计算结果将被插入到订单表包含每个产品列,产品1,产品2,产品3 ...

所以在循环后的表应该是这样的:

Product1 Product2 Product3 ... 
12  24  36 

我想到了创建另一个解释是这样的:

var results = new List<Dictionary<string, decimal>>(); 

和内部填充它的循环,然后循环使用超出这个字典将数据插入到SQL数据库中。 我已经缩短了这个例子中的产品数量,但是我们将有52个产品,这个数字永远不会改变。

这种方法是否正确?有没有更好的方法来做到这一点,可能使用Linq?你可以指出我在正确的方向与Linq这样做吗?

感谢

回答

2

没有什么特别的毛病,你都做到了,虽然有很多其他选择的方式。 在c#中,您可以轻松使用Linq进行此类操作,并且您还可以非常轻松地并行操作。

您有个'sql-server-2008'标记的问题,这让我怀疑这个操作的数据是否来自数据库。如果是这样的话,在SQL中而不是在C#中进行工作可能更有效。

所以回答你的两个问题:

这种方法是否正确? - 这当然没有错。

有没有更好的方法来做到这一点? - 还有其他的方式,但是否更好取决于问题中未提及的因素。

...更多: 我已经想出了两个linq-ish方法。第一个保存你的数据结构:

 var products = new List<Dictionary<string, decimal>>() 
     { 
      new Dictionary<string, decimal> {{"product1", 10}}, 
      new Dictionary<string, decimal> {{"product2", 20}}, 
      new Dictionary<string, decimal> {{"product3", 30}} 
     }; 
     var results = new List<Dictionary<string, decimal>>(); 

     results.AddRange(products.Select(product => 
     { 
      var resultDictionary = new Dictionary<string, decimal>(); 
      foreach (string key in product.Keys) 
      { 
       resultDictionary.Add(key, GetRatePerProduct(key)); 
      } 
      return resultDictionary; 
     })); 

第二,使一个新的产品类别涵盖你正在使用的三个属性,但做同样的工作,和他们在一起。

public class Product 
    { 
     public string ProductName { get; set; } 
     public decimal ProductValue { get; set; } 
     public decimal ProductResult { get; set; } 
    } 

     var products = new List<Product>() 
     { 
      new Product() {ProductName = "product1", ProductValue = 10}, 
      new Product() {ProductName = "product2", ProductValue = 20}, 
      new Product() {ProductName = "product3", ProductValue = 30}, 
     }; 

     var results = new List<Dictionary<string, decimal>>(); 

     foreach (var product in products) 
     { 
      product.ProductValue = GetRatePerProduct(product.ProductName); 
     } 

     // the next two lines do exactly the same thing, just one of them is explicitly parallelized 
     products.ForEach(product => { product.ProductValue = GetRatePerProduct(product.ProductName); }); 
     Parallel.ForEach(products, product => { product.ProductValue = GetRatePerProduct(product.ProductName); }); 
+0

谢谢,计算必须在C#中完成,在SQL上执行它不幸不是一个选项(业务原因)。我实际上想知道如何用Linq做到这一点,但不确定,因为我的Linq知识暂时还不够。 – 03Usr 2013-02-23 15:35:06

+0

好吧,我看的越多,我不得不问:为什么你有一个字典列表,其中每个字典只有一个键值对? – 2013-02-23 15:53:45

+0

你说得很对,有多个键值对的单个字典会更好。无需将字典放入列表中。谢谢。 – 03Usr 2013-02-23 16:04:08

0

如果您只打算使用它来存储一个键 - 值对,则没有理由使用字典对象。

更好的解决方案是创建一个具有属性名称和价格的产品,然后将这些对象添加到列表中。