@@ -24,6 +24,7 @@ public IReadOnlyList<string> GetDisplayMemberTags(IEnumerable<Tag> tags)
2424 internal IReadOnlyList < string > FormatDisplayMemberTags ( IEnumerable < string > tagNames )
2525 {
2626 var displayTags = new List < string > ( ) ;
27+ var seenTags = new HashSet < string > ( StringComparer . OrdinalIgnoreCase ) ;
2728 var supportingYears = new SortedSet < int > ( ) ;
2829 int ? supportingInsertIndex = null ;
2930
@@ -42,7 +43,7 @@ internal IReadOnlyList<string> FormatDisplayMemberTags(IEnumerable<string> tagNa
4243 continue ;
4344 }
4445
45- if ( ! displayTags . Contains ( tagName , StringComparer . OrdinalIgnoreCase ) )
46+ if ( seenTags . Add ( tagName ) )
4647 {
4748 displayTags . Add ( tagName ) ;
4849 }
@@ -70,40 +71,38 @@ private static string GetDisplayName(Tag tag)
7071
7172 private static string FormatSupportingMemberYears ( IEnumerable < int > years )
7273 {
73- var ranges = new List < string > ( ) ;
74- int ? rangeStart = null ;
75- int ? previousYear = null ;
74+ return string . Join ( ", " , GetConsecutiveYearRanges ( years ) . Select ( range => FormatRange ( range . Start , range . End ) ) ) ;
75+ }
76+
77+ private static string FormatRange ( int startYear , int endYear )
78+ {
79+ return startYear == endYear ? startYear . ToString ( ) : $ "{ startYear } -{ endYear } ";
80+ }
7681
77- foreach ( var year in years )
82+ private static IEnumerable < ( int Start , int End ) > GetConsecutiveYearRanges ( IEnumerable < int > years )
83+ {
84+ using var enumerator = years . GetEnumerator ( ) ;
85+ if ( ! enumerator . MoveNext ( ) )
7886 {
79- if ( ! rangeStart . HasValue )
80- {
81- rangeStart = year ;
82- previousYear = year ;
83- continue ;
84- }
87+ yield break ;
88+ }
8589
86- if ( year == previousYear + 1 )
90+ var rangeStart = enumerator . Current ;
91+ var rangeEnd = rangeStart ;
92+
93+ while ( enumerator . MoveNext ( ) )
94+ {
95+ var year = enumerator . Current ;
96+ if ( year == rangeEnd + 1 )
8797 {
88- previousYear = year ;
98+ rangeEnd = year ;
8999 continue ;
90100 }
91101
92- ranges . Add ( FormatRange ( rangeStart . Value , previousYear ! . Value ) ) ;
93- rangeStart = year ;
94- previousYear = year ;
95- }
96-
97- if ( rangeStart . HasValue && previousYear . HasValue )
98- {
99- ranges . Add ( FormatRange ( rangeStart . Value , previousYear . Value ) ) ;
102+ yield return ( rangeStart , rangeEnd ) ;
103+ rangeStart = rangeEnd = year ;
100104 }
101105
102- return string . Join ( ", " , ranges ) ;
103- }
104-
105- private static string FormatRange ( int startYear , int endYear )
106- {
107- return startYear == endYear ? startYear . ToString ( ) : $ "{ startYear } -{ endYear } ";
106+ yield return ( rangeStart , rangeEnd ) ;
108107 }
109108}
0 commit comments