1

次のコード スニップがあるとします。

using (var reader = cmd.ExecuteReader())
{
    while(reader.Read())
    {
        var count = reader.FieldCount; // the first column must be name all subsequent columns are treated as data
        var data = new List<double>();
        for (var i = 1; i < count; i++)
        {
            data.Add(Convert.ToDouble(reader[i].ToString()));
        }
        barChartSeries.Add(new ColumnBarChart.ColumnChartSeries((string)reader[0],
                                                                data));
        columnChart.xAxis.categories.Add((string)reader[0]);
    }
}

for ループをなくす簡単な方法はありますか? おそらくlinqを使用していますか?

reader[0] は常に文字列になります reader[0+?] は double になります

可能であれば、すべての double をリストに入れたいです。

4

4 に答える 4

6

速度は私が思うにやや懸念事項です。

次に、完全に間違った問題に焦点を合わせています。

ここで行っていることの中で、ループは最も非効率的な部分です。さらに心配なのは、 から に変換してからdoublestring戻すことdoubleです。少なくともコードを次のように修正します。

for (var i = 1; i < count; i++)
{
    data.Add(reader.GetDouble(i));
}

既知のサイズでリストを作成することもできます:

List<double> data = new List<double>(count - 1);

それでも、シリアライゼーションやデータベース アクセスと比較すると、それは無関係になるのではないかと強く思います。

何をするにしても、何かがループします。ループを隠すためにかなりの時間を費やすことができます(たとえば、行内のすべての値を反復する拡張メソッドを作成することによって) - しかし、実際には、ここで何か問題があるとは思いません。

問題があることが証明されるまで、マイクロ最適化を避けることを強くお勧めします。あなたが心配しているこのコードがボトルネックであるとしたら、私はまったく驚きます。一般に、目的を達成する最も単純なコードを作成し、パフォーマンス基準を決定してからテストする必要があります。必要な場合にのみ、単純なコードから離れてください。

于 2013-07-11T03:28:38.147 に答える
2

を削除する唯一の方法forloopは、を使用することEnumerable.Rangeです。

とにかく、次のようなことができます:

   var data = new List<double>(Enumerable.Range(1, count).Select(i => reader.GetDouble(i)));

しかし、このアプローチには何のメリットもないと思います。コードが読めなくなるだけです

于 2013-07-11T03:28:10.187 に答える
0

私はあなたがそれをループできるとは思わない

public class SqlDataReader : DbDataReader, IDataReader, IDisposable, IDataRecord

このクラスは実装していませんIEnumerable

于 2013-07-11T03:22:53.610 に答える
0

LINQ Cast メソッドを使用して、他の LINQ メソッドを使用できるものを取得できますが、他のポスターに同意します-for ループに問題はありません。LINQ メソッドは、バックグラウンドで効率の悪いループを使用するだけです。

これはうまくいくと思いますが、テストするためのデータセットをセットアップしていません。

reader.Cast<Double>().Skip(1).ToList();
于 2013-07-11T03:33:24.073 に答える