Я обсуждал эту интересную проблему с коллегой, и сначала я подумал, что решение JonSkeet было замечательным, но мой коллега указал на одну проблему, а именно: если функция является расширением до IEnumerable<T>
, тогда ее можно использовать там, где коллекция Это.
С массивом, можно с уверенностью сказать, что заказ производится с foreach
будет соблюден (т.е. foreach
будет перебирать от первого до последнего), но это не обязательно в случае с другими коллекциями (список, словарь и т.д.), где 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
будет уважать заказ на последнюю операцию ...
Спасибо - я не знал, что вы могли бы это сделать - я думал, вам нужно переназначить. – Guy 2008-10-26 02:07:23
Он называется «инициализатором проекции» - он в основном принимает последнее подвыражение (которое должно быть полем или свойством) внутри выражения и использует его для имени. Таким образом, вы можете сделать x.GetFoo(). Bar, и это будет эквивалентно Bar = x.GetFoo(). – 2008-10-26 07:12:36