Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit e7188aa

Browse files
committed
implement EnumerateIndexes() API
1 parent 0a756bc commit e7188aa

File tree

1 file changed

+76
-3
lines changed

1 file changed

+76
-3
lines changed

‎src/AlgorithmForce.Searching/Deferred/EnumerableExtensions.cs‎

Lines changed: 76 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -142,21 +142,94 @@ public static int IndexOf<T>(this IEnumerable<T> s, IReadOnlyList<T> t, int star
142142
return -1;
143143
}
144144

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+
145194
#endregion
146195

147196
#region Others
148197

149198
internal static int IndexOf<T>(this IEnumerable<T> s, T t, int startIndex, IEqualityComparer<T> comparer)
150199
where T : IEquatable<T>
151200
{
152-
foreach(var e in s)
201+
var offset = startIndex + 1;
202+
203+
using (var enumerator = s.GetEnumerator())
153204
{
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+
}
156212
}
157213
return -1;
158214
}
159215

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+
160233
internal static IEnumerator<T> Skip<T>(IEnumerator<T> enumerator, int count)
161234
{
162235
var i = 0;

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /