2

自動生成された Excel ファイルからデータを抽出するアプリケーションを作成しようとしています。これは Access で非常に簡単に行うことができますが、ファイルは Excel であり、ソリューションはボタン 1 つで行う必要があります。

なんらかの理由で、アクションを実行せずにデータを単純にループすると遅くなります。以下のコードは、はるかに遅いものから最適化しようとした私の試みです。相互運用クラスを直接、またはさまざまなラッパーを介してこれを数回試みた後、Linq to SQL を使用することに到達しました。

こことGoogleでいくつかの質問への回答も読みました。速度低下の原因を突き止めるために、すべての命令を削除しましたが、関連するセクションから「i++」を除外しました。まだ非常に遅いです。また、3 行目の where 句で取得するレコードの数を制限して最適化しようとしましたが、うまくいきませんでした。あなたの助けをいただければ幸いです。

ありがとうございました。

        Dictionary<string,double> instructors = new Dictionary<string,double>();
        var t = from c in excel.Worksheet("Course_201410_M1")
               // where c["COURSE CODE"].ToString().Substring(0,4) == "COSC" || c["COURSE CODE"].ToString().Substring(0,3) == "COEN" || c["COURSE CODE"].ToString().Substring(0,3) == "GEIT" || c["COURSE CODE"].ToString().Substring(0,3) == "ITAP" || c["COURSE CODE"] == "PRPL 0012" || c["COURSE CODE"] == "ASSE 4311" || c["COURSE CODE"] == "GEEN 2312" || c["COURSE CODE"] == "ITLB 1311"
                select c;
        HashSet<string> uniqueForce = new HashSet<string>();
        foreach (var c in t)
        {
            if(uniqueForce.Add(c["Instructor"]))
                instructors.Add(c["Instructor"],0.0);
        }
        foreach (string name in instructors.Keys)
        {
            var y = from d in t
                    where d["Instructor"] == name
                    select d;
            int i = 1;
            foreach(var z in y)
            {
                //this is the really slow. It takes a couple of minutes to finish. The 
                // file has less than a 1000 records.
                i++;
            }


        }
4

1 に答える 1

3

var t を形成するクエリを括弧で囲み、それに対して ToList() を呼び出します。

     var t = (from c in excel.Worksheet("Course_201410_M1")
     select c).ToList();

linq の遅延/遅延実行モデルにより、コレクションを反復処理するたびに、使用する List を指定しない限り、データ ソースが再クエリされます。

于 2013-09-05T12:05:20.100 に答える