Discutí este problema interesante con un colega y al principio pensé que la solución de JonSkeet era genial, pero mi colega señaló un problema, a saber, que si la función es una extensión de IEnumerable<T>
, entonces puede usarse donde una colección implementa eso.
Con una matriz, que es seguro decir que el orden producido con foreach
será respetada (es decir foreach
se repetirá desde el primero al último), pero no sería necesariamente el caso con otras colecciones (Lista, diccionario, etc.), donde foreach
no reflejaría necesariamente "orden de entrada". Sin embargo, la función está ahí, y puede ser engañosa.
Al final, acabé con algo similar a la respuesta de tvanfosson, sino como un método de extensión, para las matrices:
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();
}
Aquí está la esperanza List.ToArray
respetará el orden de la última operación ...
Gracias - No sabía que pudieras hacer eso - Pensé que tenías que reasignar. – Guy
Se llama "inicializador de proyección": básicamente toma la última subexpresión (que debe ser un campo o propiedad) dentro de la expresión y la utiliza para el nombre. Entonces podrías hacer x.GetFoo(). Bar y eso sería equivalente a Bar = x.GetFoo(). Bar. –