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は単に製品名を受け取り、10 進数のレートを返します。

このループに基づいて、計算結果が、製品ごとの列、Product1、Product2、Product3... を含む orders テーブルに挿入されます。

したがって、ループの後、テーブルは次のようになります。

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」というタグが付けられた質問があり、この操作のデータがデータベースからのものかどうか疑問に思います。その場合、C# ではなく SQL で作業を行う方が効率的かもしれません。

だからあなたの2つの質問に答えて:

このアプローチは正しいですか?-それは確かに間違っていません。

これを行うより良い方法はありますか?- 他にも方法はありますが、それらがより良いかどうかは、質問に記載されていない要因によって異なります。

... 続きを読む: 私は 2 つの linq っぽいアプローチを考え出しました。最初のものはデータ構造を保持します:

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

2 つ目は、使用している 3 つのプロパティをカバーする新しい 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

ディクショナリ オブジェクトを 1 つのキーと値のペアを格納するためだけに使用する場合は、ディクショナリ オブジェクトを使用する理由はありません。

はるかに優れた解決策は、プロパティ Name と Price を持つクラス Products を作成し、それらのオブジェクトをリストに追加することです。

于 2013-02-23T17:33:12.827 に答える