2

私はすべてのFileRecordsとZippedFileRecordsを持つクラスFileRecordとクラスを持っています。私が直面している問題は、この 2 つを区別する方法が必要だということです。各 ZippedFileRecord には、FileRecord と、ZippedFileRecord に関連付けられたファイルを解凍し、そのための FileRecord を作成する GetFileRecord() というメソッドがあります (以下のチャンク..)public class ZippedFileRecord : FileRecordSortedList mFiles

    public class ZippedFileRecord : FileRecord
    {
        FileInfo zipFileInfo; //FileName, FileCreationTime/Date
        public FileRecord myRecord = null;
        public FileRecord GetFileRecord()
        {
            if (myRecord == null)
            {
                //unzip and overwrite FileRecord
                UnZipFile();
                //return myRecord
                return myRecord;
                 }
                 else return myRecord;
            }
            ...
            ...
        } 

現在、これらの FileRecords と ZippedFileRecords を使用するコードの部分は、ユーザーが特定の日付範囲内のすべての FileRecords を取得し、画面に表示されている情報を取得できるものです。ZippedFileRecords は Zipped ファイルの代表であるため、最初に解凍する必要があります。表示するファイルを探すために使用するコードの一部を次に示します。

public GetFrames(DateTime desiredStartTime, DateTime  desiredEndTime)
{
    for(int fileIdx = mFiles.Values.Count-1; fileIdx >= 0; --fileIdx)
    {
        FileRecord rec = (FileRecord)mFiles.GetByIndex(fileIdx);
        if(rec.StartTime>= desiredStartTime && rec.EndTime<=desiredEndTime)
        {
            ...
        }
        else
        {
            ...
        }
    }
}

私の問題を引き起こしている行はFileRecord rec = (FileRecord)mFiles.GetByIndex(fileIdx);、mFiles [fileIdx]がZippedFileRecordまたはFileRecordであるかどうかを確認する方法はありますか? それができれば、画面に表示するたびに数百のファイルを解凍してから再圧縮するのではなく、必要なときにのみ解凍できるため、ユーザーの日付範囲に実際に収まるのは1つまたは2つだけです

4

6 に答える 6

2

できるよ:

var zippedFileRecord = mFiles.GetByIndex(fileIdx) as ZippedFileRecord;

if (zippedFileRecord != null)
    ... do something with it

次のようにする方がクリーンです。

foreach (var zippedFileRecord in mFiles.OfType<ZippedFileRecord>())
    ... do something with zippedFileRecord 

リストをさかのぼって何か特別なことをしているように見えますが、そうであればうまくいきません。

しかし、そのようなタイプによるフィルタリングは、多くの場合、コードのにおいがします。そのクラスで適切に実装するには、仮想GetFileRecord()メソッドを追加する必要があるかもしれません。class FileRecord次に、それをオーバーライドしてclass ZippedFileRecord、そのクラスに適した処理を行います。

GetFileRecord()次に、基になる型を気にする必要なく、ループ内でメソッドを呼び出すだけです。

GetFileRecord()一見すると、 inの実装は次のようにclass FileRecordなります。

public virtual FileRecord GetFileRecord()
{
    return this;
}

の実装はclass ZippedFileRecord、既に記述したものと同じですがoverride、宣言に追加されています。

public override FileRecord GetFileRecord()
{
    ...

次に、次のように使用できます。

for(int fileIdx = mFiles.Values.Count-1; fileIdx >= 0; --fileIdx)
{
    FileRecord rec = ((FileRecord)mFiles.GetByIndex(fileIdx)).GetFileRecord();
    ...

SortedList<TKey, TValue>最後のポイント:強い型を使用してキャストを回避できるように、ジェネリックを使用しないのはなぜですか?

于 2013-07-01T19:46:00.073 に答える