Для чего нужен Select в Linq.

Hes 2014 M09 14
419
0
0
0

Select - используется для получения новой последовательности их исходной, путем трансформации. public void Linq6() { int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; var numsPlusOne = from n in...

Метод Select - используется для получения новой последовательности из исходной,
путем трансформации каждого элемента последовательности в новую форму.
Пример из MSDN (101 Linq samples):

   
  1. public void Linq6()
  2. {
  3. int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
  4. var numsPlusOne =
  5. from n in numbers
  6. select n + 1;
  7. Console.WriteLine("Numbers + 1:");
  8. foreach (var i in numsPlusOne)
  9. {
  10. Console.WriteLine(i);
  11. }
  12. }

Можно переписать так:
var numsPlusOne = numbers.Select(n=>n+1).
Метод SelectMany.
Пример из проекта. Мне необходимо искать все существующие работающие сетевые интерфейсы, за исключением локального и извлекать свойства каждого интерфейса. Суть в том, что у каждого интерфейса может быть множество свойств. Поэтому здесь очень хорошо подойдет метод SelectMany.
Применение SelectMany

   
  1. public static IEnumerable<NetworkInterfaceInformation> InterfaceCollection =
  2. NetworkInterface.GetAllNetworkInterfaces()
  3. .SelectMany(
  4. networkInterface => networkInterface.GetIPProperties().UnicastAddresses,
  5. (networkInterface, property) => new NetworkInterfaceInformation(networkInterface, property))
  6. .Where(p => p.Interface.OperationalStatus != OperationalStatus.Up)
  7. .Where(p => p.Interface.NetworkInterfaceType != NetworkInterfaceType.Loopback)
  8. .Where(p => p.Property.IPv4Mask.Equals(IPAddress.Parse("255.255.255.0")));

Класс, в который будем трансформировать информацию о сетевых интерфейсах и их свойствах.

   
  1. public class NetworkInterfaceInformation
  2. {
  3. public NetworkInterfaceInformation(NetworkInterface @interface, UnicastIPAddressInformation property)
  4. {
  5. Interface = @interface;
  6. Property = property;
  7. }
  8. public NetworkInterface Interface { get; private set; }
  9. public UnicastIPAddressInformation Property { get; private set; }
  10. }

Select и SelectMany важны тем, что они позволяют безболезненно обрабатывать списки - неважно, каким путём они получены - Xml, List<T>, IEnumerable<T>, Dictionary<T,T1>, Sql (IQueryable). Все они наследуются от интерфейса IEnumerable/IEnumerable<T>. Также, можно точно сказать что Select/SelectMany это аналоги функций из области функционального программирования - List.map(). А также, практически первый шаг в модели MapReduce. Второй шаг - Aggregate.

Простенький пример агрегирования:

   
  1. Func<int, int, int> func = (x, y) => x + y;
  2. const int to = 5;
  3. int result = Enumerable
  4. .Range(1, to)
  5. .Aggregate((a, x) =>
  6. {
  7. var z = func(x,a);
  8. Console.WriteLine("{0}, {1}, {2}", x, a, z);
  9. return z;
  10. });
  11. Console.WriteLine("f({0}) = {1}", to, result);

Абсолютно тот же результат дал бы метод Linq Sum, но я хотел показать именно Aggregate, основные принципы его работы.

Пока на этом всё.

Оцените пост

-9