diff --git a/src/Silverback.Core/Util/EnumerableSortExtensions.cs b/src/Silverback.Core/Util/EnumerableSortExtensions.cs index 9f8d2789a..b21d896bb 100644 --- a/src/Silverback.Core/Util/EnumerableSortExtensions.cs +++ b/src/Silverback.Core/Util/EnumerableSortExtensions.cs @@ -10,14 +10,21 @@ internal static class EnumerableSortExtensions { public static IEnumerable SortBySortIndex(this IEnumerable items) { - var list = items.ToList(); - - var sortables = list.OfType().OrderBy(sorted => sorted.SortIndex).ToList(); - var notSortables = list.Where(item => item is not ISorted).ToList(); + return items.OrderBy(item => item, new SortedComparer()); + } - return sortables.Where(sorted => sorted.SortIndex <= 0).Cast() - .Union(notSortables) - .Union(sortables.Where(b => b.SortIndex > 0).Cast()); + private sealed class SortedComparer : IComparer + { + public int Compare(T x, T y) + { + return (x, y) switch + { + (ISorted xSorted, ISorted ySorted) => xSorted.SortIndex.CompareTo(ySorted.SortIndex), + (ISorted xSorted, _) => xSorted.SortIndex > 0 ? 1 : -1, + (_, ISorted ySorted) => ySorted.SortIndex > 0 ? -1 : 1, + _ => 0 + }; + } } } } diff --git a/tests/Silverback.Core.Tests/Util/EnumerableSortExtensionsTests.cs b/tests/Silverback.Core.Tests/Util/EnumerableSortExtensionsTests.cs index cba17aefe..7e9353b32 100644 --- a/tests/Silverback.Core.Tests/Util/EnumerableSortExtensionsTests.cs +++ b/tests/Silverback.Core.Tests/Util/EnumerableSortExtensionsTests.cs @@ -20,7 +20,8 @@ public void SortBySortIndex_SomeItems_SortedAsExpected() new SortedItem(50), new SortedItem(-100), new Item("unsorted3"), - new Item("unsorted2") + new Item("unsorted2"), + new SortedItem(0) }; var sorted = items.SortBySortIndex(); @@ -30,6 +31,7 @@ public void SortBySortIndex_SomeItems_SortedAsExpected() { new SortedItem(-100), new SortedItem(-50), + new SortedItem(0), new Item("unsorted3"), new Item("unsorted2"), new SortedItem(50),