这种使用字典的方式是否正确存储产品信息并应用计算

时间:2013-02-23 15:23:23

标签: c# sql-server-2008 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 只需使用productname并返回小数。

基于此循环,计算结果将插入到订单表中,该表包含每个产品的列,Product1,Product2,Product3 ......

因此在循环之后,表格应如下所示:

Product1 Product2 Product3 ...
12       24       36

我想要创建另一个这样的词典:

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

并在for循环中填充它然后在循环外部使用此字典将数据插入SQL数据库。 我缩短了此示例中的产品数量,但我们将有52种产品,这个数字永远不会改变。

这种方法对吗?是否有更好的方法可以使用Linq?在Linq这样做的时候,你能指出我正确的方向吗?

由于

2 个答案:

答案 0 :(得分: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;
        }));

第二个产生了一个新的Product类来覆盖你正在使用的三个属性,但它们也可以使用它们。

    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); });

答案 1 :(得分:0)

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

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