4

私のアプリケーションではstatic readonly、オブジェクトの大きな定数 (実際には) 配列が必要です。配列は、型の静的コンストラクターで初期化されます。

配列には 1,000 を超える項目が含まれており、その型が最初に使用されたときに、プログラムの速度が大幅に低下します。C# で大きな配列をすばやく初期化する方法があるかどうかを知りたいです。

public static class XSampa {
    public class XSampaPair : IComparable<XSampaPair> {
        public XSampaPair GetReverse() {
            return new XSampaPair(Key, Target);
        }
        public string Key { get; private set; }
        public string Target { get; private set; }
        internal XSampaPair(string key, string target) {
            Key = key;
            Target = target;
        }
        public int CompareTo(XSampaPair other) {
            if (other == null)
                throw new ArgumentNullException("other", 
                        "Cannot compare with Null.");
            if (Key == null)
                throw new NullReferenceException("Key is null!");
            if (other.Key == null)
                throw new NullReferenceException("Key is null!");
            if (Key.Length == other.Key.Length)
                return string.Compare(Key, other.Key, 
                        StringComparison.InvariantCulture);
            return other.Key.Length - other.Key;
        }
    }    
    private static readonly XSampaPair[] pairs, reversedPairs;
    public static string ParseXSampaToIpa(this string xsampa) {
        // Parsing code here...
    }
    public static string ParseIpaToXSampa(this string ipa) {
        // reverse code here...
    }
    static XSampa() {
        pairs = new [] {
            new XSampaPair("a", "\u0061"), 
            new XSampaPair("b", "\u0062"),
            new XSampaPair("b_<", "\u0253"), 
            new XSampaPair("c", "\u0063"),
            // And many more pairs initialized here...
        };
        var temp = pairs.Select(x => x.GetReversed());
        reversedPairs = temp.ToArray();
        Array.Sort(pairs);
        Array.Sort(reversedPairs);
    }
}

PS: X-SAMPA 音声転写を、対応する IPA 文字を含む Unicode 文字列に変換するために配列を使用します。

4

2 に答える 2

2

完全に初期化された onject をバイナリ ファイルにシリアル化し、そのファイルをリソースとして追加して、起動時に配列に読み込むことができます。コンストラクターが CPU を集中的に使用する場合は、改善される可能性があります。あなたのコードは何らかの解析を実行しているように見えるので、適切な改善が得られる可能性はかなり高いです。

于 2012-04-22T23:20:00.060 に答える
0

を使用するIEnumerable<yourobj>と、必要な場合にのみ列挙型を遅延して返すことができます。

これの問題は、配列を使用する場合のようにインデックスを作成できないことです。

于 2012-04-22T23:21:16.477 に答える