1

我有一个包含产品名称和相应价格的字典对象:

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

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

这种方法对吗?有没有更好的方法,可能使用 Linq?你能指出我用 Linq 做这件事的正确方向吗?

谢谢

4

2 回答 2

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); });
于 2013-02-23T15:31:41.770 回答
0

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

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

于 2013-02-23T17:33:12.827 回答