El rendimiento es útil porque le ahorra espacio. La mayoría de las optimizaciones en programación hacen una compensación entre el espacio (disco, memoria, red) y el procesamiento. El rendimiento como una construcción de programación le permite iterar sobre una colección muchas veces en secuencia sin necesidad de una copia separada de la colección para cada iteración.
Considere este ejemplo:
static IEnumerable<Person> GetAllPeople()
{
return new List<Person>()
{
new Person() { Name = "George", Surname = "Bush", City = "Washington" },
new Person() { Name = "Abraham", Surname = "Lincoln", City = "Washington" },
new Person() { Name = "Joe", Surname = "Average", City = "New York" }
};
}
static IEnumerable<Person> GetPeopleFrom(this IEnumerable<Person> people, string where)
{
foreach (var person in people)
{
if (person.City == where) yield return person;
}
yield break;
}
static IEnumerable<Person> GetPeopleWithInitial(this IEnumerable<Person> people, string initial)
{
foreach (var person in people)
{
if (person.Name.StartsWith(initial)) yield return person;
}
yield break;
}
static void Main(string[] args)
{
var people = GetAllPeople();
foreach (var p in people.GetPeopleFrom("Washington"))
{
// do something with washingtonites
}
foreach (var p in people.GetPeopleWithInitial("G"))
{
// do something with people with initial G
}
foreach (var p in people.GetPeopleWithInitial("P").GetPeopleFrom("New York"))
{
// etc
}
}
(Es obvio que no es necesario que utilice el rendimiento con los métodos de extensión, sólo se crea un poderoso paradigma para pensar acerca de los datos.)
Como se puede ver, si tiene muchos de estos métodos de "filtro" (pero puede ser cualquier tipo de método que trabaje en una lista de personas) puede encadenar muchos de ellos sin requerir espacio de almacenamiento adicional para cada paso. Esta es una forma de aumentar el lenguaje de programación (C#) para expresar mejor sus soluciones.
El primer efecto secundario de rendimiento es que se aplaza la ejecución de la lógica de filtrado hasta que realmente necesite. Si, por lo tanto, crea una variable de tipo IEnumerable <> (con rendimientos) pero nunca itera a través de ella, nunca ejecutará la lógica ni consumirá el espacio, que es una optimización potente y gratuita.
El otro efecto secundario es que el rendimiento opera en la interfaz de recogida común más bajo (IEnumerable <>), que permite la creación de código de la biblioteca-como con una amplia aplicabilidad.
Quizás quiso decir fuera de LINQ, o IEnumerable? Me imagino que los usos del rendimiento que no sean los enumeradores serían bastante raros (e interesantes). Jon Skeet menciona uno en su libro ... – Benjol
Aún soy escéptico. – Greg
el uso muy interesante de los rendimientos se encuentra en Jeffrey Richter [Power Threading Library] (http://msdn.microsoft.com/en-us/magazine/cc546608.aspx) – Yurec