2016-05-17 4 views
1

単一の顧客に対して1つのインスタンスを持つ必要があるため、カスタム構造をクラスとして実装しています。これは、5つのフィールド言うことができます、かなりの数のフィールドがあります。私は、多くの場合、別の比較戦略を使用してこれらの構造、すなわち、List<SCustomer>のリストをソートする必要がある必要があり、ビジネス・ロジックで1つのリストに対して複数の並べ替え順序を保持する方法<MyStructure>

public class SCustomer 
{ 
    public Guid ID; 
    public int PriorityIndex; 
    public string Name; 
    public DateTime BirthDate; 
    public double Rating; 
} 

は、いくつかのインスタンスする比較器として実装されている、いくつかの匿名の代理人です。

私は新しい注文が必要なたびに、Listをソートすることはパフォーマンス上の理由からオプションではありません。多くのリストを整理することは、苦痛である。すなわち、定期的(頻繁ではない)の更新があり、更新はバッチ更新であるので、それらを同期させておく必要がある。

.NETで複数のソートオーダーをリレーショナルデータセットに維持するためのアドバイスは何ですか?

参考:リストサイズは約100,000アイテムです。更新速度は、1000の読書シナリオサイクルにつき約1更新です。更新は約10%のレコードに触れる。

+1

あなたはデータベースについて言及しましたが、使用しないでください。 –

+0

ティムが言ったように。そして、これはすべて行の数、更新頻度、データベースの待ち時間などに非常に依存します。 –

+0

@TimSchmelter私はデータベースを使用します。問題は.NET側ではかなり大きなキャッシュが必要なことです。いくつかの方法でソートする必要があります。 –

答えて

1

ご注文の方法ごとにインデックスのリストを使用することができます。インデックスのリストは整数だけであるため、メモリ空間が少なくなります。例:あなたが見ることができるよう

public class SCustomer 
{ 
    public SCustomer(int ID, string Name) 
    { 
     this.ID = ID; 
     this.Name = Name; 
    } 
    public int ID; 
    public string Name; 
} 

public static void Main (string[] args) 
{ 
    List<SCustomer> people = new List<SCustomer>(); 
    SCustomer customer1 = new SCustomer (11, "Robert"); 
    SCustomer customer2 = new SCustomer (5, "Kate"); 
    SCustomer customer3 = new SCustomer (23, "David"); 
    people.Add(customer1); 
    people.Add(customer2); 
    people.Add(customer3); 

    List<int> sortingById = new List<int>(); 
    List<int> sortingByName = new List<int>(); 
    for(int i=0; i<people.Count; i++) 
    { 
     sortingById.Add(i); 
     sortingByName.Add(i); 
    } 

    sortingById.Sort((e1, e2) => people[e1].ID.CompareTo(people[e2].ID)); 
    sortingByName.Sort((e1, e2) => string.Compare(people[e1].Name, people[e2].Name)); 

    sortingById.ForEach (x => System.Console.Write (x)); 
    System.Console.WriteLine(); 
    sortingByName.ForEach (x => System.Console.Write (x)); 

} 

だから我々はsortingByIdsortingByNameを持っています。これらのリストの最初の位置には、人の中の最も低い要素(それぞれ異なる基準に従って)へのインデックスがあります。

後で要素を追加する場合は、新しいインデックスをすべての並べ替えリストに挿入する必要があります。要素はすでにソートされているので、バイナリ検索を実行するだけで済みます。

+0

参照変数には32ビット(または64ビットシステムでは64ビット)も必要です。したがって、100,000個のアイテムと10種類のソートオーダーが必要です(64ビット= 8バイト、1,000,000×8バイト= 8.000.000バイト= 7 MB)。参照の代わりにインデックスを使って作業することが妥当かどうかはわかりません(64ビットマスキンで3.5 MBのメモリ消費量しかないという利点があります)。 – JanDotNet

+0

あなたは正しいです、あまり改善はありません。それはちょっと別の方法です。 – user1754322

+0

私はそのアイデアが好きで、試してみることに感謝します。インデックスデータを 'Array'のままにしておくべきでしょうか?いくつかのスペースを確保し、必要に応じて拡張します... –

1

多くのリストを整理するのは苦痛です。すなわち、定期的(頻繁ではない)の更新があり、更新はバッチ更新であるため、同期が必要です。

ソートオーダーが組み込まれているのと同じ数のリストを内部的に保持する親リストを1つ作成することができます。親リストは、異種ソート順(適切には読取り専用リスト)で内部リストを公開することができます。したがって、アイテムを管理するインターフェイスが1つしかなく、ソート順でいつでもアクセスできます。

注:すべてのリストは同じアイテムを共有しているため、そのソリューションに必要なメモリ消費はそれほどありません。

関連する問題