4. Antes de entender o que é
Programação Reativa, vamos
entender o que não é!
5. public static string[] GetNamesFromEmployees(Employee[] employees)
{
var result = new string[employees.Length];
for (var i = 0; i < employees.Length; i++)
{
result[i] = employees[i].Name;
}
return result;
}
6. public static string[] GetNamesFromEmployees(Employee[] employees)
{
var result = new string[employees.Length];
for (var i = 0; i < employees.Length; i++)
{
result[i] = employees[i].Name;
}
return result;
}
7. public static List<string> GetNamesFromEmployees(List<Employee> employees)
{
var result = new List<string>(employees.Count);
foreach (var employee in employees)
{
result.Add(employee.Name);
}
return result;
}
8. public static IList<string> GetNamesFromEmployees(IList<Employee> employees)
{
var result = new List<string>(employees.Count);
foreach (var employee in employees)
{
result.Add(employee.Name);
}
return result;
}
9. public static IEnumerable<string> GetNamesFromEmployees(IEnumerable<Employee> employees)
{
var result = new List<string>();
foreach (var employee in employees)
{
result.Add(employee.Name);
}
return result;
}
10. public static IEnumerable<string> GetNamesFromEmployees(IEnumerable<Employee> employees)
{
var result = new List<string>();
foreach (var employee in employees)
{
result.Add(employee.Name);
}
return result;
}
11. public static IEnumerable<string> GetNamesFromEmployees(IEnumerable<Employee> employees)
{
foreach (var employee in employees)
{
yield return employee.Name;
}
}
13. using System.Collections.Generic;
using static System.Console;
public class Program
{
public static void Main()
{
WriteLine("Before calling Get4");
var elements = Get4();
WriteLine("After calling Get4");
foreach (var e in elements)
{
WriteLine(e);
}
}
public static IEnumerable<int> Get4()
{
for (var i = 1; i <= 4; i++)
{
WriteLine($"Before Yield {i}");
yield return i;
WriteLine($"After Yield {i}");
}
}
}
14. using System.Collections.Generic;
using static System.Console;
public class Program
{
public static void Main()
{
WriteLine("Before calling Get4");
var elements = Get4();
WriteLine("After calling Get4");
foreach (var e in elements)
{
WriteLine(e);
}
}
public static IEnumerable<int> Get4()
{
for (var i = 1; i <= 4; i++)
{
WriteLine($"Before Yield {i}");
yield return i;
WriteLine($"After Yield {i}");
}
}
}
Before calling Get4
15. using System.Collections.Generic;
using static System.Console;
public class Program
{
public static void Main()
{
WriteLine("Before calling Get4");
var elements = Get4();
WriteLine("After calling Get4");
foreach (var e in elements)
{
WriteLine(e);
}
}
public static IEnumerable<int> Get4()
{
for (var i = 1; i <= 4; i++)
{
WriteLine($"Before Yield {i}");
yield return i;
WriteLine($"After Yield {i}");
}
}
}
Before calling Get4
16. using System.Collections.Generic;
using static System.Console;
public class Program
{
public static void Main()
{
WriteLine("Before calling Get4");
var elements = Get4();
WriteLine("After calling Get4");
foreach (var e in elements)
{
WriteLine(e);
}
}
public static IEnumerable<int> Get4()
{
for (var i = 1; i <= 4; i++)
{
WriteLine($"Before Yield {i}");
yield return i;
WriteLine($"After Yield {i}");
}
}
}
Before calling Get4
After calling Get4
17. using System.Collections.Generic;
using static System.Console;
public class Program
{
public static void Main()
{
WriteLine("Before calling Get4");
var elements = Get4();
WriteLine("After calling Get4");
foreach (var e in elements)
{
WriteLine(e);
}
}
public static IEnumerable<int> Get4()
{
for (var i = 1; i <= 4; i++)
{
WriteLine($"Before Yield {i}");
yield return i;
WriteLine($"After Yield {i}");
}
}
}
Before calling Get4
After calling Get4
18. using System.Collections.Generic;
using static System.Console;
public class Program
{
public static void Main()
{
WriteLine("Before calling Get4");
var elements = Get4();
WriteLine("After calling Get4");
foreach (var e in elements)
{
WriteLine(e);
}
}
public static IEnumerable<int> Get4()
{
for (var i = 1; i <= 4; i++)
{
WriteLine($"Before Yield {i}");
yield return i;
WriteLine($"After Yield {i}");
}
}
}
Before calling Get4
After calling Get4
19. using System.Collections.Generic;
using static System.Console;
public class Program
{
public static void Main()
{
WriteLine("Before calling Get4");
var elements = Get4();
WriteLine("After calling Get4");
foreach (var e in elements)
{
WriteLine(e);
}
}
public static IEnumerable<int> Get4()
{
for (var i = 1; i <= 4; i++)
{
WriteLine($"Before Yield {i}");
yield return i;
WriteLine($"After Yield {i}");
}
}
}
Before calling Get4
After calling Get4
20. using System.Collections.Generic;
using static System.Console;
public class Program
{
public static void Main()
{
WriteLine("Before calling Get4");
var elements = Get4();
WriteLine("After calling Get4");
foreach (var e in elements)
{
WriteLine(e);
}
}
public static IEnumerable<int> Get4()
{
for (var i = 1; i <= 4; i++)
{
WriteLine($"Before Yield {i}");
yield return i;
WriteLine($"After Yield {i}");
}
}
}
Before calling Get4
After calling Get4
21. using System.Collections.Generic;
using static System.Console;
public class Program
{
public static void Main()
{
WriteLine("Before calling Get4");
var elements = Get4();
WriteLine("After calling Get4");
foreach (var e in elements)
{
WriteLine(e);
}
}
public static IEnumerable<int> Get4()
{
for (var i = 1; i <= 4; i++)
{
WriteLine($"Before Yield {i}");
yield return i;
WriteLine($"After Yield {i}");
}
}
}
Before calling Get4
After calling Get4
22. using System.Collections.Generic;
using static System.Console;
public class Program
{
public static void Main()
{
WriteLine("Before calling Get4");
var elements = Get4();
WriteLine("After calling Get4");
foreach (var e in elements)
{
WriteLine(e);
}
}
public static IEnumerable<int> Get4()
{
for (var i = 1; i <= 4; i++)
{
WriteLine($"Before Yield {i}");
yield return i;
WriteLine($"After Yield {i}");
}
}
}
Before calling Get4
After calling Get4
Before Yield 1
23. using System.Collections.Generic;
using static System.Console;
public class Program
{
public static void Main()
{
WriteLine("Before calling Get4");
var elements = Get4();
WriteLine("After calling Get4");
foreach (var e in elements)
{
WriteLine(e);
}
}
public static IEnumerable<int> Get4()
{
for (var i = 1; i <= 4; i++)
{
WriteLine($"Before Yield {i}");
yield return i;
WriteLine($"After Yield {i}");
}
}
}
Before calling Get4
After calling Get4
Before Yield 1
24. using System.Collections.Generic;
using static System.Console;
public class Program
{
public static void Main()
{
WriteLine("Before calling Get4");
var elements = Get4();
WriteLine("After calling Get4");
foreach (var e in elements)
{
WriteLine(e);
}
}
public static IEnumerable<int> Get4()
{
for (var i = 1; i <= 4; i++)
{
WriteLine($"Before Yield {i}");
yield return i;
WriteLine($"After Yield {i}");
}
}
}
Before calling Get4
After calling Get4
Before Yield 1
25. using System.Collections.Generic;
using static System.Console;
public class Program
{
public static void Main()
{
WriteLine("Before calling Get4");
var elements = Get4();
WriteLine("After calling Get4");
foreach (var e in elements)
{
WriteLine(e);
}
}
public static IEnumerable<int> Get4()
{
for (var i = 1; i <= 4; i++)
{
WriteLine($"Before Yield {i}");
yield return i;
WriteLine($"After Yield {i}");
}
}
}
Before calling Get4
After calling Get4
Before Yield 1
26. using System.Collections.Generic;
using static System.Console;
public class Program
{
public static void Main()
{
WriteLine("Before calling Get4");
var elements = Get4();
WriteLine("After calling Get4");
foreach (var e in elements)
{
WriteLine(e);
}
}
public static IEnumerable<int> Get4()
{
for (var i = 1; i <= 4; i++)
{
WriteLine($"Before Yield {i}");
yield return i;
WriteLine($"After Yield {i}");
}
}
}
Before calling Get4
After calling Get4
Before Yield 1
1
27. using System.Collections.Generic;
using static System.Console;
public class Program
{
public static void Main()
{
WriteLine("Before calling Get4");
var elements = Get4();
WriteLine("After calling Get4");
foreach (var e in elements)
{
WriteLine(e);
}
}
public static IEnumerable<int> Get4()
{
for (var i = 1; i <= 4; i++)
{
WriteLine($"Before Yield {i}");
yield return i;
WriteLine($"After Yield {i}");
}
}
}
Before calling Get4
After calling Get4
Before Yield 1
1
28. using System.Collections.Generic;
using static System.Console;
public class Program
{
public static void Main()
{
WriteLine("Before calling Get4");
var elements = Get4();
WriteLine("After calling Get4");
foreach (var e in elements)
{
WriteLine(e);
}
}
public static IEnumerable<int> Get4()
{
for (var i = 1; i <= 4; i++)
{
WriteLine($"Before Yield {i}");
yield return i;
WriteLine($"After Yield {i}");
}
}
}
Before calling Get4
After calling Get4
Before Yield 1
1
29. using System.Collections.Generic;
using static System.Console;
public class Program
{
public static void Main()
{
WriteLine("Before calling Get4");
var elements = Get4();
WriteLine("After calling Get4");
foreach (var e in elements)
{
WriteLine(e);
}
}
public static IEnumerable<int> Get4()
{
for (var i = 1; i <= 4; i++)
{
WriteLine($"Before Yield {i}");
yield return i;
WriteLine($"After Yield {i}");
}
}
}
Before calling Get4
After calling Get4
Before Yield 1
1
After Yield 1
30. using System.Collections.Generic;
using static System.Console;
public class Program
{
public static void Main()
{
WriteLine("Before calling Get4");
var elements = Get4();
WriteLine("After calling Get4");
foreach (var e in elements)
{
WriteLine(e);
}
}
public static IEnumerable<int> Get4()
{
for (var i = 1; i <= 4; i++)
{
WriteLine($"Before Yield {i}");
yield return i;
WriteLine($"After Yield {i}");
}
}
}
Before calling Get4
After calling Get4
Before Yield 1
1
After Yield 1
Before Yield 2
31. using System.Collections.Generic;
using static System.Console;
public class Program
{
public static void Main()
{
WriteLine("Before calling Get4");
var elements = Get4();
WriteLine("After calling Get4");
foreach (var e in elements)
{
WriteLine(e);
}
}
public static IEnumerable<int> Get4()
{
for (var i = 1; i <= 4; i++)
{
WriteLine($"Before Yield {i}");
yield return i;
WriteLine($"After Yield {i}");
}
}
}
Before calling Get4
After calling Get4
Before Yield 1
1
After Yield 1
Before Yield 2
...
33. public static IEnumerable<string> GetNamesFromEmployees(IEnumerable<Employee> employees)
{
foreach (var employee in employees)
{
yield return employee.Name;
}
}
34. public static class EnumerableOfEmployees
{
public static IEnumerable<string> GetNames(IEnumerable<Employee> employees)
{
foreach (var employee in employees)
{
yield return employee.Name;
}
}
}
EnumerableOfEmployees.GetNames(someListOfEmployees);
35. public static class EnumerableOfEmployees
{
public static IEnumerable<string> GetNames(
this IEnumerable<Employee> employees
)
{
foreach (var employee in employees)
{
yield return employee.Name;
}
}
}
var names = someListOfEmployees.GetNames();
var names = EnumerableOfEmployees.GetNames(someListOfEmployees);
36. public static class EnumerableOfEmployees
{
public static IEnumerable<string> GetNames(
this IEnumerable<Employee> employees
)
{
foreach (var employee in employees)
{
yield return employee.Name;
}
}
public static IEnumerable<string> GetSocialSecurityNumbers(
this IEnumerable<Employee> employees
)
{
foreach (var employee in employees)
{
yield return employee.SocialSecurityNumber;
}
}
}
37. public static class EnumerableOfEmployees
{
public static IEnumerable<string> GetNames(
this IEnumerable<Employee> employees
)
{
foreach (var employee in employees)
{
yield return employee.Name;
}
}
public static IEnumerable<string> GetSocialSecurityNumbers(
this IEnumerable<Employee> employees
)
{
foreach (var employee in employees)
{
yield return employee.SocialSecurityNumber;
}
}
}
38. public static class EnumerableOfEmployees
{
public static IEnumerable<TResult> Get<TResult>(
this IEnumerable<Employee> employees,
Func<Employee, TResult> selector
)
{
foreach (var employee in employees)
{
yield return selector(employee);
}
}
}
var names = someListOfEmployees.Get(e => e.Name);
var ssn = someListOfEmployees.Get(e => e.SocialSecurityNumber);
39. public static class EnumerableOfEmployees
{
public static IEnumerable<TResult> Get<TResult>(
this IEnumerable<Employee> employees,
Func<Employee, TResult> selector
)
{
foreach (var employee in employees)
{
yield return selector(employee);
}
}
}
40. public static class Enumerable
{
public static IEnumerable<TResult> Get<T, TResult>(
this IEnumerable<T> elements,
Func<T, TResult> selector
)
{
foreach (var element in elements)
{
yield return selector(element);
}
}
}
41. public static class Enumerable
{
public static IEnumerable<TResult> Get<T, TResult>(
this IEnumerable<T> elements,
Func<T, TResult> selector
)
{
foreach (var element in elements)
{
yield return selector(element);
}
}
}
42. public static class Enumerable
{
public static IEnumerable<TResult> Select<T, TResult>(
this IEnumerable<T> elements,
Func<T, TResult> selector
)
{
foreach (var element in elements)
{
yield return selector(element);
}
}
}
44. public static class Enumerable
{
public static IEnumerable<TResult> Select<T, TResult>(
this IEnumerable<T> elements,
Func<T, TResult> selector
)
{
foreach (var element in elements)
{
yield return selector(element);
}
}
}
var names = someListOfEmployees.Select(e => e.Name);
var ssn = someListOfEmployees.Select(e => e.SocialSecurityNumber);
45. public static IEnumerable<T> Where<T>(
this IEnumerable<T> elements,
Func<T, bool> filter
)
{
foreach (var element in elements)
{
if (filter(element))
{
yield return element;
}
}
}
46. public static IEnumerable<T> Take<T>(
this IEnumerable<T> elements,
int count
)
{
var i = 0;
foreach (var element in elements)
{
if (i >= count) yield break;
yield return element;
i++;
}
}
47. public static class Enumerable
{
public static IEnumerable<TResult> Select<T, TResult>(
this IEnumerable<T> elements,
Func<T, TResult> selector
)
{
foreach (var element in elements)
{
yield return selector(element);
}
}
}
public interface IEnumerable<out T> : IEnumerable
{
IEnumerator<T> GetEnumerator();
}
48. public static class Enumerable
{
public static IEnumerable<TResult> Select<T, TResult>(
this IEnumerable<T> elements,
Func<T, TResult> selector
)
{
foreach (var element in elements)
{
yield return selector(element);
}
}
}
public interface IEnumerable<out T> : IEnumerable
{
IEnumerator<T> GetEnumerator();
}
public interface IEnumerator<out T> : IDisposable, IEnumerator
{
T Current { get; }
}
49. public static class Enumerable
{
public static IEnumerable<TResult> Select<T, TResult>(
this IEnumerable<T> elements,
Func<T, TResult> selector
)
{
foreach (var element in elements)
{
yield return selector(element);
}
}
}
public interface IEnumerable<out T> : IEnumerable
{
IEnumerator<T> GetEnumerator();
}
public interface IEnumerator<out T> : IDisposable, IEnumerator
{
T Current { get; }
}
public interface IEnumerator
{
object Current { get; }
bool MoveNext();
void Reset();
}
50. public static IEnumerable<TResult> Select<T, TResult>(
this IEnumerable<T> elements,
Func<T, TResult> selector
)
{
using (var enumerator = elements.GetEnumerator())
{
while (enumerator.MoveNext())
{
yield return selector(enumerator.Current);
}
}
}
51. public static IEnumerable<TResult> Select<T, TResult>(
this IEnumerable<T> elements,
Func<T, TResult> selector
)
{
using (var enumerator = elements.GetEnumerator())
{
while (enumerator.MoveNext())
{
yield return selector(enumerator.Current);
}
}
}
public interface IEnumerable<out T> : IEnumerable
{
IEnumerator<T> GetEnumerator();
}
public interface IEnumerator<out T> : IDisposable, IEnumerator
{
T Current { get; }
}
public interface IEnumerator
{
object Current { get; }
bool MoveNext();
void Reset();
}
52. public static IEnumerable<TResult> Select<T, TResult>(
this IEnumerable<T> elements,
Func<T, TResult> selector
)
{
using (var enumerator = elements.GetEnumerator())
{
while (enumerator.MoveNext())
{
yield return selector(enumerator.Current);
}
}
}
public interface IEnumerable<out T> : IEnumerable
{
IEnumerator<T> GetEnumerator();
}
public interface IEnumerator<out T> : IDisposable, IEnumerator
{
T Current { get; }
}
public interface IEnumerator
{
object Current { get; }
bool MoveNext();
void Reset();
}
53. public static IEnumerable<TResult> Select<T, TResult>(
this IEnumerable<T> elements,
Func<T, TResult> selector
)
{
using (var enumerator = elements.GetEnumerator())
{
while (enumerator.MoveNext())
{
yield return selector(enumerator.Current);
}
}
}
public interface IEnumerable<out T> : IEnumerable
{
IEnumerator<T> GetEnumerator();
}
public interface IEnumerator<out T> : IDisposable, IEnumerator
{
T Current { get; }
}
public interface IEnumerator
{
object Current { get; }
bool MoveNext();
void Reset();
}
54. public static IEnumerable<TResult> Select<T, TResult>(
this IEnumerable<T> elements,
Func<T, TResult> selector
)
{
using (var enumerator = elements.GetEnumerator())
{
while (enumerator.MoveNext())
{
yield return selector(enumerator.Current);
}
}
}
public interface IEnumerable<out T> : IEnumerable
{
IEnumerator<T> GetEnumerator();
}
public interface IEnumerator<out T> : IDisposable, IEnumerator
{
T Current { get; }
}
public interface IEnumerator
{
object Current { get; }
bool MoveNext();
void Reset();
}
55. public static IEnumerable<TResult> Select<T, TResult>(
this IEnumerable<T> elements,
Func<T, TResult> selector
)
{
using (var enumerator = elements.GetEnumerator())
{
while (enumerator.MoveNext())
{
yield return selector(enumerator.Current);
}
}
}
public interface IEnumerable<out T> : IEnumerable
{
IEnumerator<T> GetEnumerator();
}
public interface IEnumerator<out T> : IDisposable, IEnumerator
{
T Current { get; }
}
public interface IEnumerator
{
object Current { get; }
bool MoveNext();
void Reset();
}
56. public static IEnumerable<TResult> Select<T, TResult>(
this IEnumerable<T> elements,
Func<T, TResult> selector
)
{
using (var enumerator = elements.GetEnumerator())
{
while (enumerator.MoveNext())
{
yield return selector(enumerator.Current);
}
}
}
57. public static IEnumerable<TResult> Select<T, TResult>(
this IEnumerable<T> elements,
Func<T, TResult> selector
) => new SelectEnumerable<T, TResult>(elements, selector);
class SelectEnumerable<T, TResult> : IEnumerable<TResult>
{
private readonly IEnumerable<T> _elements;
private readonly Func<T, TResult> _selector;
public SelectEnumerable(
IEnumerable<T> elements,
Func<T, TResult> selector
)
{
_elements = elements;
_selector = selector;
}
public IEnumerator<TResult> GetEnumerator()
=> new SelectEnumerator(_elements.GetEnumerator(), _selector);
IEnumerator IEnumerable.GetEnumerator()
=> GetEnumerator();
}
58. public static IEnumerable<TResult> Select<T, TResult>(
this IEnumerable<T> elements,
Func<T, TResult> selector
) => new SelectEnumerable<T, TResult>(elements, selector);
class SelectEnumerable<T, TResult> : IEnumerable<TResult>
{
private readonly IEnumerable<T> _elements;
private readonly Func<T, TResult> _selector;
public SelectEnumerable(
IEnumerable<T> elements,
Func<T, TResult> selector
)
{
_elements = elements;
_selector = selector;
}
public IEnumerator<TResult> GetEnumerator()
=> new SelectEnumerator(_elements.GetEnumerator, _selector);
IEnumerator IEnumerable.GetEnumerator()
=> GetEnumerator();
}
class SelectEnumerator<T, TResult> : IEnumerator<TResult>
{
private readonly IEnumerator<T> _source;
private readonly Func<T, TResult> _selector;
public SelectEnumerator(
IEnumerator<T> source,
Func<T, TResult> selector
)
{
_source = source;
_selector = selector;
}
public void Dispose() => _source.Dispose();
public bool MoveNext() => _source.MoveNext();
public void Reset() => _source.Dispose();
public TResult Current => _selector(_source.Current);
object IEnumerator.Current => Current;
}
59. var names = someEmployees.Select(e => e.Name);
foreach (var name in names)
{
Console.WriteLine(name);
}
var names = someEmployees.Select(e => e.Name);
using (var enumerator = names.GetEnumerator())
{
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
}
60. var names = someEmployees.Select(e => e.Name);
using (var enumerator = names.GetEnumerator())
{
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
}
61. var names = someEmployees.Select(e => e.Name);
using (var enumerator = names.GetEnumerator())
{
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
}
public static IEnumerable<TResult> Select<T, TResult>(
this IEnumerable<T> elements,
Func<T, TResult> selector
) => new SelectEnumerable<T, TResult>(elements, selector);
62. var names = someEmployees.Select(e => e.Name);
using (var enumerator = names.GetEnumerator())
{
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
}
63. var names = someEmployees.Select(e => e.Name);
using (var enumerator = names.GetEnumerator())
{
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
} class SelectEnumerable<T, TResult> : IEnumerable<TResult>
{
private readonly IEnumerable<T> _elements;
private readonly Func<T, TResult> _selector;
public SelectEnumerable(
IEnumerable<T> elements,
Func<T, TResult> selector
)
{
_elements = elements;
_selector = selector;
}
public IEnumerator<TResult> GetEnumerator()
=> new SelectEnumerator(_elements.GetEnumerator, _selector);
IEnumerator IEnumerable.GetEnumerator()
=> GetEnumerator();
}
64. var names = someEmployees.Select(e => e.Name);
using (var enumerator = names.GetEnumerator())
{
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
}
class SelectEnumerator<T, TResult> : IEnumerator<TResult>
{
private readonly IEnumerator<T> _source;
private readonly Func<T, TResult> _selector;
public SelectEnumerator(
IEnumerator<T> source,
Func<T, TResult> selector
)
{
_source = source;
_selector = selector;
}
public void Dispose() => _source.Dispose();
public bool MoveNext() => _source.MoveNext();
public void Reset() => _source.Dispose();
public TResult Current => _selector(_source.Current);
object IEnumerator.Current => Current;
}
65. var names = someEmployees.Select(e => e.Name);
using (var enumerator = names.GetEnumerator())
{
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
}
class SelectEnumerator<T, TResult> : IEnumerator<TResult>
{
private readonly IEnumerator<T> _source;
private readonly Func<T, TResult> _selector;
public SelectEnumerator(
IEnumerator<T> source,
Func<T, TResult> selector
)
{
_source = source;
_selector = selector;
}
public void Dispose() => _source.Dispose();
public bool MoveNext() => _source.MoveNext();
public void Reset() => _source.Dispose();
public TResult Current => _selector(_source.Current);
object IEnumerator.Current => Current;
}
66. var names = someEmployees.Select(e => e.Name);
using (var enumerator = names.GetEnumerator())
{
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
}
class SelectEnumerator<T, TResult> : IEnumerator<TResult>
{
private readonly IEnumerator<T> _source;
private readonly Func<T, TResult> _selector;
public SelectEnumerator(
IEnumerator<T> source,
Func<T, TResult> selector
)
{
_source = source;
_selector = selector;
}
public void Dispose() => _source.Dispose();
public bool MoveNext() => _source.MoveNext();
public void Reset() => _source.Dispose();
public TResult Current => _selector(_source.Current);
object IEnumerator.Current => Current;
}
67. var names = someEmployees.Select(e => e.Name);
using (var enumerator = names.GetEnumerator())
{
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
}
class SelectEnumerator<T, TResult> : IEnumerator<TResult>
{
private readonly IEnumerator<T> _source;
private readonly Func<T, TResult> _selector;
public SelectEnumerator(
IEnumerator<T> source,
Func<T, TResult> selector
)
{
_source = source;
_selector = selector;
}
public void Dispose() => _source.Dispose();
public bool MoveNext() => _source.MoveNext();
public void Reset() => _source.Dispose();
public TResult Current => _selector(_source.Current);
object IEnumerator.Current => Current;
}
68. var names = someEmployees.Select(e => e.Name);
using (var enumerator = names.GetEnumerator())
{
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
}
class SelectEnumerator<T, TResult> : IEnumerator<TResult>
{
private readonly IEnumerator<T> _source;
private readonly Func<T, TResult> _selector;
public SelectEnumerator(
IEnumerator<T> source,
Func<T, TResult> selector
)
{
_source = source;
_selector = selector;
}
public void Dispose() => _source.Dispose();
public bool MoveNext() => _source.MoveNext();
public void Reset() => _source.Dispose();
public TResult Current => _selector(_source.Current);
object IEnumerator.Current => Current;
}
69. var names = someEmployees.Select(e => e.Name);
using (var enumerator = names.GetEnumerator())
{
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
}
class SelectEnumerator<T, TResult> : IEnumerator<TResult>
{
private readonly IEnumerator<T> _source;
private readonly Func<T, TResult> _selector;
public SelectEnumerator(
IEnumerator<T> source,
Func<T, TResult> selector
)
{
_source = source;
_selector = selector;
}
public void Dispose() => _source.Dispose();
public bool MoveNext() => _source.MoveNext();
public void Reset() => _source.Dispose();
public TResult Current => _selector(_source.Current);
object IEnumerator.Current => Current;
}
70. class WhereEnumerator<T> : IEnumerator<T>
{
private readonly IEnumerator<T> _source;
private readonly Func<T, bool> _filter;
public WhereEnumerator(
IEnumerator<T> source,
Func<T, bool> filter
)
{
_source = source;
_filter = filter;
}
public void Dispose() => _source.Dispose();
public bool MoveNext()
{
while (_source.MoveNext())
if (_filter(_source.Current))
return true;
return false;
}
public void Reset() => _source.Reset();
public T Current => _source.Current;
object IEnumerator.Current => Current;
}
71. class WhereEnumerator<T> : IEnumerator<T>
{
private readonly IEnumerator<T> _source;
private readonly Func<T, bool> _filter;
public WhereEnumerator(
IEnumerator<T> source,
Func<T, bool> filter
)
{
_source = source;
_filter = filter;
}
public void Dispose() => _source.Dispose();
public bool MoveNext()
{
while (_source.MoveNext())
if (_filter(_source.Current))
return true;
return false;
}
public void Reset() => _source.Reset();
public T Current => _source.Current;
object IEnumerator.Current => Current;
}
class SelectEnumerator<T, TResult> : IEnumerator<TResult>
{
private readonly IEnumerator<T> _source;
private readonly Func<T, TResult> _selector;
public SelectEnumerator(
IEnumerator<T> source,
Func<T, TResult> selector
)
{
_source = source;
_selector = selector;
}
public void Dispose() => _source.Dispose();
public bool MoveNext() => _source.MoveNext();
public void Reset() => _source.Dispose();
public TResult Current => _selector(_source.Current);
object IEnumerator.Current => Current;
}
73. using System.Collections.Generic;
using static System.Console;
public class Program
{
public static void Main()
{
WriteLine("Before calling Get4");
var elements = Get4();
WriteLine("After calling Get4");
foreach (var e in elements)
{
WriteLine(e);
}
}
public static IEnumerable<int> Get4()
{
for (var i = 1; i <= 4; i++)
{
WriteLine($"Before Yield {i}");
yield return i;
WriteLine($"After Yield {i}");
}
}
}
public static IEnumerable<int> Get4()
=> new Get4Enumerable();
74. using System.Collections.Generic;
using static System.Console;
public class Program
{
public static void Main()
{
WriteLine("Before calling Get4");
var elements = Get4();
WriteLine("After calling Get4");
foreach (var e in elements)
{
WriteLine(e);
}
}
public static IEnumerable<int> Get4()
{
for (var i = 1; i <= 4; i++)
{
WriteLine($"Before Yield {i}");
yield return i;
WriteLine($"After Yield {i}");
}
}
}
using (var enumerator = elements.GetEnumerator())
{
while (enumerator.MoveNext())
{
WriteLine(enumerator.Current);
}
}
75. using System.Collections.Generic;
using static System.Console;
public class Program
{
public static void Main()
{
WriteLine("Before calling Get4");
var elements = Get4();
WriteLine("After calling Get4");
foreach (var e in elements)
{
WriteLine(e);
}
}
public static IEnumerable<int> Get4()
{
for (var i = 1; i <= 4; i++)
{
WriteLine($"Before Yield {i}");
yield return i;
WriteLine($"After Yield {i}");
}
}
}
class Get4Enumerator : IEnumerator<int>
{
private int _state;
private int _current;
public void Dispose() { }
bool IEnumerator.MoveNext()
{
if (_state == 1) WriteLine($"After Yield {_current}");
if (_current >= 4)
{
_state = 2;
return false;
}
_current++;
WriteLine($"Before Yield {_current}");
_state = 1;
return true;
}
public void Reset() { _current = 0; }
public int Current => _current;
object IEnumerator.Current => Current;
}
118. var form = this;
var mouseDown = Observable.FromEventPattern<MouseEventHandler, MouseEventArgs>(
h => form.MouseDown += h,
h => form.MouseDown -= h
);
var mouseUp = Observable.FromEventPattern<MouseEventHandler, MouseEventArgs>(
h => form.MouseUp += h,
h => form.MouseUp -= h
);
var mouseMove = Observable.FromEventPattern<MouseEventHandler, MouseEventArgs>(
h => form.MouseMove += h,
h => form.MouseMove -= h
);
119. var dragging =
from down in mouseDown
from move in mouseMove.TakeUntil(mouseUp)
select new
{
Start = down.EventArgs.Location,
Finish = move.EventArgs.Location
};
120. var subscription = dragging.Subscribe(info =>
{
using (Graphics g = form.CreateGraphics())
g.DrawLine(Pens.Red, info.Start, info.Finish);
});
122. var keyUp = Observable.FromEventPattern<KeyEventHandler, KeyEventArgs>(
h => form.KeyUp += h,
h => form.KeyUp -= h
)
.Select(key => key.EventArgs.KeyCode);
124. var abcPressed =
from fst in WherePressedIs(Keys.A)
from snd in WherePressedIs(Keys.B).Take(1).TakeUntil(WherePressedIsNot(Keys.B))
from thd in WherePressedIs(Keys.C).Take(1).TakeUntil(WherePressedIsNot(Keys.C))
select new Unit();