Я обсуждал эту интересную проблему с коллегой, и сначала мне показалось, что решение JonSkeet было отличным, но мой коллега указал на одну проблему, а именно: если функция является расширением IEnumerable<T>
, то ее можно использовать там, где коллекция реализует его.
С массивом можно с уверенностью сказать, что порядок, созданный с помощью foreach
, будет соблюдаться (т. Е. foreach
будет повторяться от первого к последнему), но это не обязательно будет иметь место с другими коллекциями (List, Dictionary, и т.д.), где foreach
не будет отражать обязательно «порядок входа». И все же функция есть, и она может вводить в заблуждение.
В итоге я получил нечто похожее на ответ tvanfosson, но в качестве метода расширения для массивов:
public static int[] GetIndexes<T>(this T[]source, Func<T, bool> predicate)
{
List<int> matchingIndexes = new List<int>();
for (int i = 0; i < source.Length; ++i)
{
if (predicate(source[i]))
{
matchingIndexes.Add(i);
}
}
return matchingIndexes.ToArray();
}
Здесь надеемся, что List.ToArray
будет соблюдать порядок последней операции ...