我有一个包含产品名称和相应价格的字典对象:
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这样做的时候,你能指出我正确的方向吗?
由于
答案 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属性的类产品,然后将这些对象添加到列表中。