このアプリケーションでは、Datatables をすべてのデータ コンテナー コントロールの DataSource として使用しています。これらは Win Form Grid です。しかし今、DataTables から離れて、オブジェクト ベースの Generic .Net コレクションの使用を開始することにしました。移行の理由は、DevExpress コントロールを使用しており、オブジェクトのコレクションで実際に動作する Data Grid が提供する ServerMode オプションを利用したいからです。以下は Collections で実装する必要がある重要なことです:
- DataTable によって提供される主キー機能については、ジェネリック コレクションで同じものを維持するためのアプローチを理解する必要があります。
- DataTable.Merge 機能が必要です。Enumerable.Union を使用できることはわかっていますが、主キーとして機能するオブジェクトの少数のメンバーに基づいてコレクションにマージする効率的な方法が他にあるかどうかを尋ねたいと思います。
- DataRelations : コレクションで DataRelation のような機能を維持する方法。
- この移行で注意が必要なその他の制限または設計上の注意事項。
私はすでにDataTable をコレクションとして置換するための Best c# generics class? という質問を経験しましたか?
しかし、私の場合は十分ではなかったので、新しい質問をします。
参照用にいくつかのコード サンプル/KB 記事を提案または指摘してください。
更新#1:
この質問には、コレクションのキーベースのマージに関するいくつかの指針があります: キー c# に基づいて 2 つのリストをマージします。
しかし、GUI に表示するエンド コレクションで 500K 以上のレコードを見ているため、このアプローチのパフォーマンスについてはわかりません。
更新 #2:
Enumerable.Union は、私のシナリオでは役に立ちません。2 つのコレクションをマージするため、次のようになります。
私が持っている場合
List<Student> mainList
List<Student> newList
どこ
Student.RollNo
使用します
IComparable on Student class comparing RollNo for two Student objects.
主キーである必要があります。マージは次のようになります。
- newList からのすべての新しい生徒は、mainList に追加する必要があります。
- Student が mainList と newList に既に存在する場合は、常に newList の Student をオーバーライドし、古いものを削除して新しいものを追加する必要があります。
プロパティ属性または同様のものを使用して、いくつかのXML構成に基づいて動的に学生クラスのメンバーを主キーとして指定し、同じものを使用する方法はありますか?
IComparable.Compare
これを達成する効率的な方法が他にある場合は、List.Find と List.Replace を避けたいと思います。