@@ -142,21 +142,94 @@ public static int IndexOf<T>(this IEnumerable<T> s, IReadOnlyList<T> t, int star
142
142
return - 1 ;
143
143
}
144
144
145
+ internal static IEnumerable < int > EnumerateIndexes < T > ( this IEnumerable < T > s , IReadOnlyList < T > t , int startIndex , IEqualityComparer < T > comparer )
146
+ where T : IEquatable < T >
147
+ {
148
+ var table = TableBuilder . BuildTable ( t , comparer ) ;
149
+ var i = 0 ;
150
+ var offset = startIndex + 1 ;
151
+
152
+ using ( var enumerator = s . GetEnumerator ( ) )
153
+ {
154
+ while ( Skip ( enumerator , offset ) != null )
155
+ {
156
+ if ( comparer . Equals ( t [ i ] , enumerator . Current ) )
157
+ {
158
+ if ( i == t . Count - 1 )
159
+ {
160
+ yield return startIndex ;
161
+
162
+ startIndex ++ ;
163
+ offset = 1 ;
164
+ i = 0 ;
165
+ }
166
+ else
167
+ {
168
+ i ++ ;
169
+ }
170
+ }
171
+ else
172
+ {
173
+ // We will extract this as a method GetOffset() in future version
174
+ // for upcoming APIs:
175
+ // 1. IndexOfAny(IReadOnlyList{T}, IEnumerable{IReadOnlyList{T}})
176
+ // 2. IndexesOfAll(IReadOnlyList{T}, IEnumerable{IReadOnlyList{T}}).
177
+ if ( table [ i ] > - 1 )
178
+ {
179
+ startIndex += i ;
180
+ offset = i ;
181
+ i = table [ i ] ;
182
+ }
183
+ else
184
+ {
185
+ startIndex ++ ;
186
+ offset = 1 ;
187
+ i = 0 ;
188
+ }
189
+ }
190
+ }
191
+ }
192
+ }
193
+
145
194
#endregion
146
195
147
196
#region Others
148
197
149
198
internal static int IndexOf < T > ( this IEnumerable < T > s , T t , int startIndex , IEqualityComparer < T > comparer )
150
199
where T : IEquatable < T >
151
200
{
152
- foreach ( var e in s )
201
+ var offset = startIndex + 1 ;
202
+
203
+ using ( var enumerator = s . GetEnumerator ( ) )
153
204
{
154
- if ( comparer . Equals ( e , t ) ) return startIndex ;
155
- startIndex ++ ;
205
+ while ( Skip ( enumerator , offset ) != null )
206
+ {
207
+ if ( comparer . Equals ( t , enumerator . Current ) ) return startIndex ;
208
+
209
+ startIndex ++ ;
210
+ offset = 1 ;
211
+ }
156
212
}
157
213
return - 1 ;
158
214
}
159
215
216
+ internal static IEnumerable < int > EnumerateIndexes < T > ( this IEnumerable < T > s , T t , int startIndex , IEqualityComparer < T > comparer )
217
+ where T : IEquatable < T >
218
+ {
219
+ var offset = startIndex + 1 ;
220
+
221
+ using ( var enumerator = s . GetEnumerator ( ) )
222
+ {
223
+ while ( Skip ( enumerator , offset ) != null )
224
+ {
225
+ if ( comparer . Equals ( t , enumerator . Current ) ) yield return startIndex ;
226
+
227
+ startIndex ++ ;
228
+ offset = 1 ;
229
+ }
230
+ }
231
+ }
232
+
160
233
internal static IEnumerator < T > Skip < T > ( IEnumerator < T > enumerator , int count )
161
234
{
162
235
var i = 0 ;
0 commit comments