Ejemplo n.º 1
0
        public List <T> GetSortedCollection <T>(ICollection <T> InputCollection, SortTarget?Target, SortDirection?Direction) where T : FileSystemStorageItemBase
        {
            SortTarget    TempTarget    = Target ?? SortTarget;
            SortDirection TempDirection = Direction ?? SortDirection;

            IEnumerable <T> FolderList = InputCollection.Where((It) => It.StorageType == StorageItemTypes.Folder);
            IEnumerable <T> FileList   = InputCollection.Where((It) => It.StorageType == StorageItemTypes.File);

            switch (TempTarget)
            {
            case SortTarget.Name:
            {
                return(TempDirection == SortDirection.Ascending
                            ? new List <T>(FolderList.OrderByLikeFileSystem((Item) => Item.Name, TempDirection).Concat(FileList.OrderByLikeFileSystem((Item) => Item.Name, TempDirection)))
                            : new List <T>(FileList.OrderByLikeFileSystem((Item) => Item.Name, TempDirection).Concat(FolderList.OrderByLikeFileSystem((Item) => Item.Name, TempDirection))));
            }

            case SortTarget.Type:
            {
                return(TempDirection == SortDirection.Ascending
                            ? new List <T>(FolderList.OrderByLikeFileSystem((Item) => Item.Type, TempDirection).Concat(FileList.OrderByLikeFileSystem((Item) => Item.Type, TempDirection)))
                            : new List <T>(FileList.OrderByLikeFileSystem((Item) => Item.Type, TempDirection).Concat(FolderList.OrderByLikeFileSystem((Item) => Item.Type, TempDirection))));
            }

            case SortTarget.ModifiedTime:
            {
                return(TempDirection == SortDirection.Ascending
                            ? new List <T>(FolderList.OrderBy((Item) => Item.ModifiedTimeRaw).Concat(FileList.OrderBy((Item) => Item.ModifiedTimeRaw)))
                            : new List <T>(FileList.OrderByDescending((Item) => Item.ModifiedTimeRaw).Concat(FolderList.OrderByDescending((Item) => Item.ModifiedTimeRaw))));
            }

            case SortTarget.Size:
            {
                return(TempDirection == SortDirection.Ascending
                            ? new List <T>(FolderList.OrderBy((Item) => Item.SizeRaw).Concat(FileList.OrderBy((Item) => Item.SizeRaw)))
                            : new List <T>(FileList.OrderByDescending((Item) => Item.SizeRaw).Concat(FolderList.OrderByDescending((Item) => Item.SizeRaw))));
            }

            case SortTarget.Path:
            {
                return(TempDirection == SortDirection.Ascending
                            ? new List <T>(FolderList.OrderBy((Item) => Item.Path).Concat(FileList.OrderBy((Item) => Item.SizeRaw)))
                            : new List <T>(FileList.OrderByDescending((Item) => Item.Path).Concat(FolderList.OrderByDescending((Item) => Item.SizeRaw))));
            }

            default:
            {
                if (typeof(T) == typeof(RecycleStorageItem))
                {
                    return(TempDirection == SortDirection.Ascending
                                ? new List <T>(FolderList.Select((Item) => Item as RecycleStorageItem).OrderBy((Item) => Item.OriginPath).Concat(FileList.Select((Item) => Item as RecycleStorageItem).OrderBy((Item) => Item.OriginPath)).Select((Item) => Item as T))
                                : new List <T>(FolderList.Select((Item) => Item as RecycleStorageItem).OrderByDescending((Item) => Item.OriginPath).Concat(FileList.Select((Item) => Item as RecycleStorageItem).OrderByDescending((Item) => Item.OriginPath)).Select((Item) => Item as T)));
                }
                else
                {
                    return(null);
                }
            }
            }
        }
Ejemplo n.º 2
0
 public static void SetIndicatorStatus(SortTarget Target, SortDirection Direction)
 {
     foreach (SortIndicatorController Instance in CurrentInstance)
     {
         SetIndicatorCore(Instance, Target, Direction);
     }
 }
Ejemplo n.º 3
0
        public IEnumerable <T> GetSortedCollection <T>(IEnumerable <T> InputCollection, SortTarget?Target, SortDirection?Direction) where T : IStorageItemPropertyBase
        {
            SortTarget    TempTarget    = Target ?? SortTarget;
            SortDirection TempDirection = Direction ?? SortDirection;

            IEnumerable <T> FolderList = InputCollection.Where((It) => It is FileSystemStorageFolder);
            IEnumerable <T> FileList   = InputCollection.Where((It) => It is FileSystemStorageFile);

            switch (TempTarget)
            {
            case SortTarget.Name:
            {
                return(TempDirection == SortDirection.Ascending
                            ? FolderList.OrderByLikeFileSystem((Item) => Item.Name, TempDirection).Concat(FileList.OrderByLikeFileSystem((Item) => Item.Name, TempDirection))
                            : FileList.OrderByLikeFileSystem((Item) => Item.Name, TempDirection).Concat(FolderList.OrderByLikeFileSystem((Item) => Item.Name, TempDirection)));
            }

            case SortTarget.Type:
            {
                return(TempDirection == SortDirection.Ascending
                            ? FolderList.OrderByLikeFileSystem((Item) => Item.Type, TempDirection).Concat(FileList.OrderByLikeFileSystem((Item) => Item.Type, TempDirection))
                            : FileList.OrderByLikeFileSystem((Item) => Item.Type, TempDirection).Concat(FolderList.OrderByLikeFileSystem((Item) => Item.Type, TempDirection)));
            }

            case SortTarget.ModifiedTime:
            {
                return(TempDirection == SortDirection.Ascending
                            ? FolderList.OrderBy((Item) => Item.ModifiedTimeRaw).Concat(FileList.OrderBy((Item) => Item.ModifiedTimeRaw))
                            : FileList.OrderByDescending((Item) => Item.ModifiedTimeRaw).Concat(FolderList.OrderByDescending((Item) => Item.ModifiedTimeRaw)));
            }

            case SortTarget.Size:
            {
                return(TempDirection == SortDirection.Ascending
                            ? FolderList.OrderBy((Item) => Item.SizeRaw).Concat(FileList.OrderBy((Item) => Item.SizeRaw))
                            : FileList.OrderByDescending((Item) => Item.SizeRaw).Concat(FolderList.OrderByDescending((Item) => Item.SizeRaw)));
            }

            case SortTarget.Path:
            {
                return(TempDirection == SortDirection.Ascending
                            ? FolderList.OrderBy((Item) => Item.Path).Concat(FileList.OrderBy((Item) => Item.SizeRaw))
                            : FileList.OrderByDescending((Item) => Item.Path).Concat(FolderList.OrderByDescending((Item) => Item.SizeRaw)));
            }

            default:
            {
                if (typeof(T) == typeof(IRecycleStorageItem))
                {
                    return(TempDirection == SortDirection.Ascending
                                ? FolderList.OfType <IRecycleStorageItem>().OrderBy((Item) => Item.OriginPath).Concat(FileList.OfType <IRecycleStorageItem>().OrderBy((Item) => Item.OriginPath)).OfType <T>()
                                : FolderList.OfType <IRecycleStorageItem>().OrderByDescending((Item) => Item.OriginPath).Concat(FileList.OfType <IRecycleStorageItem>().OrderByDescending((Item) => Item.OriginPath)).OfType <T>());
                }
                else
                {
                    return(null);
                }
            }
            }
        }
Ejemplo n.º 4
0
        public PathConfiguration(string Path, SortTarget Target, SortDirection Direction)
        {
            if (string.IsNullOrWhiteSpace(Path))
            {
                throw new ArgumentException("Argument could not be empty or white space", nameof(Path));
            }

            this.Path          = Path;
            this.SortDirection = Direction;
            this.SortTarget    = Target;
        }
Ejemplo n.º 5
0
 /// <summary>オプション指定して作成</summary>
 public SearchOption(
     SortOrder       SortOrder,
     SortTarget      SortTarget,
     PostTimeFilter  PostTimeFilter,
     PlayTimeFilter  PlayTimeFilter)
 {
     this.SortOrder = SortOrder;
     this.SortTarget = SortTarget;
     this.PostTimeFilter = PostTimeFilter;
     this.PlayTimeFilter = PlayTimeFilter;
 }
Ejemplo n.º 6
0
 /// <summary>オプション指定して作成</summary>
 public SearchOption(
     SortOrder SortOrder,
     SortTarget SortTarget,
     PostTimeFilter PostTimeFilter,
     PlayTimeFilter PlayTimeFilter)
 {
     this.SortOrder      = SortOrder;
     this.SortTarget     = SortTarget;
     this.PostTimeFilter = PostTimeFilter;
     this.PlayTimeFilter = PlayTimeFilter;
 }
Ejemplo n.º 7
0
        public PathConfiguration(string Path, int DisplayModeIndex, SortTarget SortColumn, SortDirection SortDirection)
        {
            if (string.IsNullOrWhiteSpace(Path))
            {
                throw new ArgumentException("Argument could not be empty or white space", nameof(Path));
            }

            this.Path             = Path;
            this.DisplayModeIndex = DisplayModeIndex;
            this.SortDirection    = SortDirection;
            this.SortColumn       = SortColumn;
        }
Ejemplo n.º 8
0
 private GetOption(ByteSequence endKey, long limit, long revision,
                   SortOrder sortOrder, SortTarget sortTarget, bool serializable, bool keysOnly,
                   bool countOnly)
 {
     this.endKey       = endKey;
     this.limit        = limit;
     this.revision     = revision;
     this.sortOrder    = sortOrder;
     this.sortTarget   = sortTarget;
     this.serializable = serializable;
     this.keysOnly     = keysOnly;
     this.countOnly    = countOnly;
 }
Ejemplo n.º 9
0
        public static void SavePathSortState(string Path, SortTarget Target, SortDirection Direction)
        {
            if (Target == SortTarget.OriginPath || Target == SortTarget.Path)
            {
                throw new NotSupportedException("SortTarget.Path and SortTarget.OriginPath is not allowed in this method");
            }

            PathConfiguration CurrentConfiguration = SQLite.Current.GetPathConfiguration(Path);

            if (CurrentConfiguration.SortTarget != Target || CurrentConfiguration.SortDirection != Direction)
            {
                SQLite.Current.SetPathConfiguration(new PathConfiguration(Path, Target, Direction));
                SortStateChanged?.Invoke(null, new SortStateChangedEventArgs(Path, Target, Direction));
            }
        }
Ejemplo n.º 10
0
        /// <summary>
        /// キーの取得
        /// </summary>
        public static string ToKey(this SortTarget SortTarget)
        {
            switch (SortTarget)
            {
            case SortTarget.None: return("n");

            case SortTarget.Comment: return("n");

            case SortTarget.ViewCount: return("v");

            case SortTarget.CommentCount: return("r");

            case SortTarget.MylistCount: return("m");

            case SortTarget.PostTime: return("f");

            case SortTarget.VideoTime: return("l");

            default: throw new Exception("設定したサーチオプションが不正です");
            }
        }
Ejemplo n.º 11
0
        /**
         * convert client SortTarget to apu SortTarget.
         */
        public static RangeRequest.Types.SortTarget ToRangeRequestSortTarget(SortTarget target)
        {
            switch (target)
            {
            case SortTarget.KEY:
                return(RangeRequest.Types.SortTarget.Key);

            case SortTarget.CREATE:
                return(RangeRequest.Types.SortTarget.Create);

            case SortTarget.MOD:
                return(RangeRequest.Types.SortTarget.Mod);

            case SortTarget.VALUE:
                return(RangeRequest.Types.SortTarget.Value);

            case SortTarget.VERSION:
                return(RangeRequest.Types.SortTarget.Version);

            default:
                return(RangeRequest.Types.SortTarget.Create);
            }
        }
Ejemplo n.º 12
0
 /**
  * Sort the return key value pairs in the provided <i>field</i>.
  *
  * @param field field to sort the key value pairs by the provided
  * @return builder
  */
 public Builder withSortField(SortTarget field)
 {
     this.sortTarget = field;
     return(this);
 }
Ejemplo n.º 13
0
        private static void SetIndicatorCore(SortIndicatorController Instance, SortTarget Target, SortDirection Direction)
        {
            switch (Target)
            {
            case SortTarget.Name:
            {
                Instance.Indicator1Icon = new FontIcon {
                    Glyph = Direction == SortDirection.Ascending ? UpArrowIcon : DownArrowIcon
                };

                Instance.Indicator1Visibility = Visibility.Visible;
                Instance.Indicator2Visibility = Visibility.Collapsed;
                Instance.Indicator3Visibility = Visibility.Collapsed;
                Instance.Indicator4Visibility = Visibility.Collapsed;

                break;
            }

            case SortTarget.ModifiedTime:
            {
                Instance.Indicator2Icon = new FontIcon {
                    Glyph = Direction == SortDirection.Ascending ? UpArrowIcon : DownArrowIcon
                };

                Instance.Indicator1Visibility = Visibility.Collapsed;
                Instance.Indicator2Visibility = Visibility.Visible;
                Instance.Indicator3Visibility = Visibility.Collapsed;
                Instance.Indicator4Visibility = Visibility.Collapsed;

                break;
            }

            case SortTarget.Type:
            {
                Instance.Indicator3Icon = new FontIcon {
                    Glyph = Direction == SortDirection.Ascending ? UpArrowIcon : DownArrowIcon
                };

                Instance.Indicator1Visibility = Visibility.Collapsed;
                Instance.Indicator2Visibility = Visibility.Collapsed;
                Instance.Indicator3Visibility = Visibility.Visible;
                Instance.Indicator4Visibility = Visibility.Collapsed;

                break;
            }

            case SortTarget.Size:
            {
                Instance.Indicator4Icon = new FontIcon {
                    Glyph = Direction == SortDirection.Ascending ? UpArrowIcon : DownArrowIcon
                };

                Instance.Indicator1Visibility = Visibility.Collapsed;
                Instance.Indicator2Visibility = Visibility.Collapsed;
                Instance.Indicator3Visibility = Visibility.Collapsed;
                Instance.Indicator4Visibility = Visibility.Visible;

                break;
            }

            default:
            {
                throw new NotSupportedException("SortTarget is not supported");
            }
            }

            Instance.PropertyChanged?.Invoke(Instance, new PropertyChangedEventArgs(nameof(Indicator1Icon)));
            Instance.PropertyChanged?.Invoke(Instance, new PropertyChangedEventArgs(nameof(Indicator2Icon)));
            Instance.PropertyChanged?.Invoke(Instance, new PropertyChangedEventArgs(nameof(Indicator3Icon)));
            Instance.PropertyChanged?.Invoke(Instance, new PropertyChangedEventArgs(nameof(Indicator4Icon)));
            Instance.PropertyChanged?.Invoke(Instance, new PropertyChangedEventArgs(nameof(Indicator1Visibility)));
            Instance.PropertyChanged?.Invoke(Instance, new PropertyChangedEventArgs(nameof(Indicator2Visibility)));
            Instance.PropertyChanged?.Invoke(Instance, new PropertyChangedEventArgs(nameof(Indicator3Visibility)));
            Instance.PropertyChanged?.Invoke(Instance, new PropertyChangedEventArgs(nameof(Indicator4Visibility)));
        }
Ejemplo n.º 14
0
        public static int SearchInsertLocation <T>(ICollection <T> InputCollection, T SearchTarget, SortTarget Target, SortDirection Direction) where T : IStorageItemPropertiesBase
        {
            if (InputCollection == null)
            {
                throw new ArgumentNullException(nameof(InputCollection), "Argument could not be null");
            }

            if (SearchTarget == null)
            {
                throw new ArgumentNullException(nameof(SearchTarget), "Argument could not be null");
            }

            IEnumerable <T> FilteredCollection = null;

            if (SearchTarget is FileSystemStorageFile)
            {
                FilteredCollection = InputCollection.Where((Item) => Item is FileSystemStorageFile);
            }
            else if (SearchTarget is FileSystemStorageFolder)
            {
                FilteredCollection = InputCollection.Where((Item) => Item is FileSystemStorageFolder);
            }
            else
            {
                return(-1);
            }

            switch (Target)
            {
            case SortTarget.Name:
            {
                if (Direction == SortDirection.Ascending)
                {
                    (int Index, T Item)SearchResult = FilteredCollection.Select((Item, Index) => (Index, Item)).FirstOrDefault((Value) => string.Compare(Value.Item.Name, SearchTarget.Name, StringComparison.OrdinalIgnoreCase) > 0);

                    if (SearchResult.Item == null)
                    {
                        if (SearchTarget is FileSystemStorageFile)
                        {
                            return(InputCollection.Count);
                        }
                        else
                        {
                            return(InputCollection.Count((Item) => Item is FileSystemStorageFolder));
                        }
                    }
                    else
                    {
                        if (SearchTarget is FileSystemStorageFile)
                        {
                            return(SearchResult.Index + InputCollection.Count((Item) => Item is FileSystemStorageFolder));
                        }
                        else
                        {
                            return(SearchResult.Index);
                        }
                    }
                }
                else
                {
                    //未找到任何匹配的项目时,FirstOrDefault返回元组的默认值,而int的默认值刚好契合此处需要返回0的要求,因此无需像SortDirection.Ascending一样进行额外处理
                    int Index = FilteredCollection.Select((Item, Index) => (Index, Item)).FirstOrDefault((Value) => string.Compare(Value.Item.Name, SearchTarget.Name, StringComparison.OrdinalIgnoreCase) < 0).Index;

                    if (SearchTarget is FileSystemStorageFolder)
                    {
                        Index += InputCollection.Count((Item) => Item is FileSystemStorageFile);
                    }

                    return(Index);
                }
            }

            case SortTarget.Type:
            {
                if (Direction == SortDirection.Ascending)
                {
                    (int Index, T Item)SearchResult = FilteredCollection.Select((Item, Index) => (Index, Item)).FirstOrDefault((Value) => string.Compare(Value.Item.Type, SearchTarget.Type, StringComparison.OrdinalIgnoreCase) > 0);

                    if (SearchResult.Item == null)
                    {
                        if (SearchTarget is FileSystemStorageFile)
                        {
                            return(InputCollection.Count);
                        }
                        else
                        {
                            return(InputCollection.Count((Item) => Item is FileSystemStorageFolder));
                        }
                    }
                    else
                    {
                        if (SearchTarget is FileSystemStorageFile)
                        {
                            return(SearchResult.Index + InputCollection.Count((Item) => Item is FileSystemStorageFolder));
                        }
                        else
                        {
                            return(SearchResult.Index);
                        }
                    }
                }
                else
                {
                    //未找到任何匹配的项目时,FirstOrDefault返回元组的默认值,而int的默认值刚好契合此处需要返回0的要求,因此无需像SortDirection.Ascending一样进行额外处理
                    int Index = FilteredCollection.Select((Item, Index) => (Index, Item)).FirstOrDefault((Value) => string.Compare(Value.Item.Type, SearchTarget.Type, StringComparison.OrdinalIgnoreCase) < 0).Index;

                    if (SearchTarget is FileSystemStorageFolder)
                    {
                        Index += InputCollection.Count((Item) => Item is FileSystemStorageFile);
                    }

                    return(Index);
                }
            }

            case SortTarget.ModifiedTime:
            {
                if (Direction == SortDirection.Ascending)
                {
                    (int Index, T Item)SearchResult = FilteredCollection.Select((Item, Index) => (Index, Item)).FirstOrDefault((Value) => DateTimeOffset.Compare(Value.Item.ModifiedTimeRaw, SearchTarget.ModifiedTimeRaw) > 0);

                    if (SearchResult.Item == null)
                    {
                        if (SearchTarget is FileSystemStorageFile)
                        {
                            return(InputCollection.Count);
                        }
                        else
                        {
                            return(InputCollection.Count((Item) => Item is FileSystemStorageFolder));
                        }
                    }
                    else
                    {
                        if (SearchTarget is FileSystemStorageFile)
                        {
                            return(SearchResult.Index + InputCollection.Count((Item) => Item is FileSystemStorageFolder));
                        }
                        else
                        {
                            return(SearchResult.Index);
                        }
                    }
                }
                else
                {
                    //未找到任何匹配的项目时,FirstOrDefault返回元组的默认值,而int的默认值刚好契合此处需要返回0的要求,因此无需像SortDirection.Ascending一样进行额外处理
                    int Index = FilteredCollection.Select((Item, Index) => (Index, Item)).FirstOrDefault((Value) => DateTimeOffset.Compare(Value.Item.ModifiedTimeRaw, SearchTarget.ModifiedTimeRaw) < 0).Index;

                    if (SearchTarget is FileSystemStorageFolder)
                    {
                        Index += InputCollection.Count((Item) => Item is FileSystemStorageFile);
                    }

                    return(Index);
                }
            }

            case SortTarget.Size:
            {
                if (Direction == SortDirection.Ascending)
                {
                    (int Index, T Item)SearchResult = FilteredCollection.Select((Item, Index) => (Index, Item)).FirstOrDefault((Value) => Value.Item.SizeRaw.CompareTo(SearchTarget.SizeRaw) > 0);

                    if (SearchResult.Item == null)
                    {
                        if (SearchTarget is FileSystemStorageFile)
                        {
                            return(InputCollection.Count);
                        }
                        else
                        {
                            return(InputCollection.Count((Item) => Item is FileSystemStorageFolder));
                        }
                    }
                    else
                    {
                        if (SearchTarget is FileSystemStorageFile)
                        {
                            return(SearchResult.Index + InputCollection.Count((Item) => Item is FileSystemStorageFolder));
                        }
                        else
                        {
                            return(SearchResult.Index);
                        }
                    }
                }
                else
                {
                    //未找到任何匹配的项目时,FirstOrDefault返回元组的默认值,而int的默认值刚好契合此处需要返回0的要求,因此无需像SortDirection.Ascending一样进行额外处理
                    int Index = FilteredCollection.Select((Item, Index) => (Index, Item)).FirstOrDefault((Value) => Value.Item.SizeRaw.CompareTo(SearchTarget.SizeRaw) < 0).Index;

                    if (SearchTarget is FileSystemStorageFolder)
                    {
                        Index += InputCollection.Count((Item) => Item is FileSystemStorageFile);
                    }

                    return(Index);
                }
            }

            default:
            {
                return(-1);
            }
            }
        }
Ejemplo n.º 15
0
        public static int SearchInsertLocation <T>(ICollection <T> InputCollection, T SearchTarget, SortTarget Target, SortDirection Direction) where T : IStorageItemPropertiesBase
        {
            if (InputCollection == null)
            {
                throw new ArgumentNullException(nameof(InputCollection), "Argument could not be null");
            }

            if (SearchTarget == null)
            {
                throw new ArgumentNullException(nameof(SearchTarget), "Argument could not be null");
            }

            IEnumerable <T> FilteredCollection = null;

            if (SearchTarget is FileSystemStorageFile)
            {
                FilteredCollection = InputCollection.Where((Item) => Item is FileSystemStorageFile);
            }
            else if (SearchTarget is FileSystemStorageFolder)
            {
                FilteredCollection = InputCollection.Where((Item) => Item is FileSystemStorageFolder);
            }
            else
            {
                return(-1);
            }

            switch (Target)
            {
            case SortTarget.Name:
            {
                List <T> FilteredCollectionCopy = new List <T>(FilteredCollection)
                {
                    SearchTarget
                };

                int Index = FilteredCollectionCopy.OrderByLikeFileSystem((Item) => Item.Name, Direction)
                            .Select((Item, Index) => (Index, Item))
                            .First((Value) => Value.Item.Equals(SearchTarget)).Index;

                if (Direction == SortDirection.Ascending)
                {
                    if (SearchTarget is FileSystemStorageFile)
                    {
                        Index += InputCollection.Count((Item) => Item is FileSystemStorageFolder);
                    }
                }
                else
                {
                    if (SearchTarget is FileSystemStorageFolder)
                    {
                        Index += InputCollection.Count((Item) => Item is FileSystemStorageFile);
                    }
                }

                return(Index);
            }

            case SortTarget.Type:
            {
                List <T> InputCollectionCopy = new List <T>(InputCollection)
                {
                    SearchTarget
                };

                if (Direction == SortDirection.Ascending)
                {
                    return(InputCollectionCopy.Where((Item) => Item is FileSystemStorageFolder)
                           .OrderBy((Item) => Item.Type)
                           .Concat(InputCollectionCopy.Where((Item) => Item is FileSystemStorageFile).OrderBy((Item) => Item.Type))
                           .GroupBy((Item) => Item.Type)
                           .Select((Group) => Group.OrderByLikeFileSystem((Item) => Item.Name, Direction))
                           .SelectMany((Array) => Array)
                           .Select((Item, Index) => (Index, Item))
                           .First((Value) => Value.Item.Equals(SearchTarget)).Index);
                }
                else
                {
                    return(InputCollectionCopy.Where((Item) => Item is FileSystemStorageFolder)
                           .OrderByDescending((Item) => Item.Type)
                           .Concat(InputCollectionCopy.Where((Item) => Item is FileSystemStorageFile).OrderByDescending((Item) => Item.Type))
                           .GroupBy((Item) => Item.Type)
                           .Select((Group) => Group.OrderByLikeFileSystem((Item) => Item.Name, Direction))
                           .SelectMany((Array) => Array)
                           .Select((Item, Index) => (Index, Item))
                           .First((Value) => Value.Item.Equals(SearchTarget)).Index);
                }
            }

            case SortTarget.ModifiedTime:
            {
                if (Direction == SortDirection.Ascending)
                {
                    (int Index, T Item)SearchResult = FilteredCollection.Select((Item, Index) => (Index, Item))
                                                      .FirstOrDefault((Value) => DateTimeOffset.Compare(Value.Item.ModifiedTimeRaw, SearchTarget.ModifiedTimeRaw) > 0);

                    if (SearchResult.Item == null)
                    {
                        if (SearchTarget is FileSystemStorageFile)
                        {
                            return(InputCollection.Count);
                        }
                        else
                        {
                            return(InputCollection.Count((Item) => Item is FileSystemStorageFolder));
                        }
                    }
                    else
                    {
                        if (SearchTarget is FileSystemStorageFile)
                        {
                            return(SearchResult.Index + InputCollection.Count((Item) => Item is FileSystemStorageFolder));
                        }
                        else
                        {
                            return(SearchResult.Index);
                        }
                    }
                }
                else
                {
                    //未找到任何匹配的项目时,FirstOrDefault返回元组的默认值,而int的默认值刚好契合此处需要返回0的要求,因此无需像SortDirection.Ascending一样进行额外处理
                    int Index = FilteredCollection.Select((Item, Index) => (Index, Item))
                                .FirstOrDefault((Value) => DateTimeOffset.Compare(Value.Item.ModifiedTimeRaw, SearchTarget.ModifiedTimeRaw) < 0).Index;

                    if (SearchTarget is FileSystemStorageFolder)
                    {
                        Index += InputCollection.Count((Item) => Item is FileSystemStorageFile);
                    }

                    return(Index);
                }
            }

            case SortTarget.Size:
            {
                if (SearchTarget is FileSystemStorageFolder)
                {
                    List <T> FilteredCollectionCopy = new List <T>(FilteredCollection)
                    {
                        SearchTarget
                    };

                    int Index = FilteredCollectionCopy.OrderByLikeFileSystem((Item) => Item.Name, SortDirection.Ascending)
                                .Select((Item, Index) => (Index, Item))
                                .First((Value) => Value.Item.Equals(SearchTarget)).Index;

                    if (Direction == SortDirection.Descending)
                    {
                        Index += InputCollection.Count((Item) => Item is FileSystemStorageFile);
                    }

                    return(Index);
                }
                else
                {
                    if (Direction == SortDirection.Ascending)
                    {
                        (int Index, T Item)SearchResult = FilteredCollection.Select((Item, Index) => (Index, Item))
                                                          .FirstOrDefault((Value) => Value.Item.SizeRaw.CompareTo(SearchTarget.SizeRaw) > 0);

                        if (SearchResult.Item == null)
                        {
                            return(InputCollection.Count);
                        }
                        else
                        {
                            return(SearchResult.Index + InputCollection.Count((Item) => Item is FileSystemStorageFolder));
                        }
                    }
                    else
                    {
                        return(FilteredCollection.Select((Item, Index) => (Index, Item))
                               .FirstOrDefault((Value) => Value.Item.SizeRaw.CompareTo(SearchTarget.SizeRaw) < 0).Index);
                    }
                }
            }

            default:
            {
                return(-1);
            }
            }
        }
Ejemplo n.º 16
0
 public SortStateChangedEventArgs(string Path, SortTarget Target, SortDirection Direction)
 {
     this.Path      = Path;
     this.Target    = Target;
     this.Direction = Direction;
 }
Ejemplo n.º 17
0
        public static IEnumerable <T> GetSortedCollection <T>(IEnumerable <T> InputCollection, SortTarget Target, SortDirection Direction) where T : IStorageItemPropertiesBase
        {
            IEnumerable <T> FolderList = InputCollection.Where((It) => It is FileSystemStorageFolder);
            IEnumerable <T> FileList   = InputCollection.Where((It) => It is FileSystemStorageFile);

            switch (Target)
            {
            case SortTarget.Name:
            {
                return(Direction == SortDirection.Ascending
                                            ? FolderList.OrderByLikeFileSystem((Item) => Item.Name, Direction)
                       .Concat(FileList.OrderByLikeFileSystem((Item) => Item.Name, Direction))
                                            : FileList.OrderByLikeFileSystem((Item) => Item.Name, Direction)
                       .Concat(FolderList.OrderByLikeFileSystem((Item) => Item.Name, Direction)));
            }

            case SortTarget.Type:
            {
                return(Direction == SortDirection.Ascending
                                            ? FolderList.OrderBy((Item) => Item.Type)
                       .Concat(FileList.OrderBy((Item) => Item.Type))
                       .GroupBy((Item) => Item.Type)
                       .Select((Group) => Group.OrderByLikeFileSystem((Item) => Item.Name, Direction))
                       .SelectMany((Array) => Array)
                                            : FolderList.OrderByDescending((Item) => Item.Type)
                       .Concat(FileList.OrderByDescending((Item) => Item.Type))
                       .GroupBy((Item) => Item.Type)
                       .Select((Group) => Group.OrderByLikeFileSystem((Item) => Item.Name, Direction))
                       .SelectMany((Array) => Array));
            }

            case SortTarget.ModifiedTime:
            {
                return(Direction == SortDirection.Ascending
                                            ? FolderList.OrderBy((Item) => Item.ModifiedTimeRaw)
                       .Concat(FileList.OrderBy((Item) => Item.ModifiedTimeRaw))
                                            : FileList.OrderByDescending((Item) => Item.ModifiedTimeRaw)
                       .Concat(FolderList.OrderByDescending((Item) => Item.ModifiedTimeRaw)));
            }

            case SortTarget.Size:
            {
                return(Direction == SortDirection.Ascending
                                            ? FolderList.OrderByLikeFileSystem((Item) => Item.Name, SortDirection.Ascending)
                       .Concat(FileList.OrderBy((Item) => Item.SizeRaw))
                                            : FileList.OrderByDescending((Item) => Item.SizeRaw)
                       .Concat(FolderList.OrderByLikeFileSystem((Item) => Item.Name, SortDirection.Ascending)));
            }

            case SortTarget.Path:
            {
                return(Direction == SortDirection.Ascending
                                            ? FolderList.OrderBy((Item) => Item.Path)
                       .Concat(FileList.OrderBy((Item) => Item.SizeRaw))
                                            : FileList.OrderByDescending((Item) => Item.Path)
                       .Concat(FolderList.OrderByDescending((Item) => Item.SizeRaw)));
            }

            default:
            {
                if (typeof(T) == typeof(IRecycleStorageItem))
                {
                    return(Direction == SortDirection.Ascending
                                                ? FolderList.OfType <IRecycleStorageItem>()
                           .OrderBy((Item) => Item.OriginPath)
                           .Concat(FileList.OfType <IRecycleStorageItem>().OrderBy((Item) => Item.OriginPath))
                           .OfType <T>()
                                                : FolderList.OfType <IRecycleStorageItem>()
                           .OrderByDescending((Item) => Item.OriginPath)
                           .Concat(FileList.OfType <IRecycleStorageItem>().OrderByDescending((Item) => Item.OriginPath))
                           .OfType <T>());
                }
                else
                {
                    return(null);
                }
            }
            }
        }