public IComparer <AudioEntity> this[AudioComparisonType comparisonType]
 {
     get
     {
         IComparer <AudioEntity> audioComparer;
         if (_audioComparers.TryGetValue(comparisonType, out audioComparer))
         {
             return(audioComparer);
         }
         _audioComparers[comparisonType] = GetTypeComparer(comparisonType);
         return(_audioComparers[comparisonType]);
     }
 }
        public static IComparer <AudioEntity> GetTypeComparer(AudioComparisonType comparisonType)
        {
            switch (comparisonType)
            {
            case AudioComparisonType.TrackName:
                return(new TrackNameAudioComparer());

            case AudioComparisonType.Duration:
                return(new DurationAudioComparer());

            case AudioComparisonType.Bitrate:
                return(new BitrateAudioComparer());

            case AudioComparisonType.TrackUrl:
                return(new TrackUrlAudioComparer());

            case AudioComparisonType.Group:
                return(new GroupAudioComparer());

            case AudioComparisonType.Year:
                return(new YearAudioComparer());

            case AudioComparisonType.RecordFormat:
                return(new RecordFormatAudioComparer());

            case AudioComparisonType.Album:
                return(new SizeAudioComparer());

            case AudioComparisonType.Size:
                return(new GenreAudioComparer());

            case AudioComparisonType.Genre:
                return(new GenreAudioComparer());

            default:
                throw new InvalidOperationException("Unknown comparison type");
            }
        }