Метод Select - используется для получения новой последовательности из исходной,
путем трансформации каждого элемента последовательности в новую форму.
Пример из MSDN (101 Linq samples):
-
public void Linq6()
-
{
-
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
-
var numsPlusOne =
-
from n in numbers
-
select n + 1;
-
Console.WriteLine("Numbers + 1:");
-
foreach (var i in numsPlusOne)
-
{
-
Console.WriteLine(i);
-
}
-
}
Можно переписать так:
var numsPlusOne = numbers.Select(n=>n+1).
Метод SelectMany.
Пример из проекта. Мне необходимо искать все существующие работающие сетевые интерфейсы, за исключением локального и извлекать свойства каждого интерфейса. Суть в том, что у каждого интерфейса может быть множество свойств. Поэтому здесь очень хорошо подойдет метод SelectMany.
Применение SelectMany
-
public static IEnumerable<NetworkInterfaceInformation> InterfaceCollection =
-
NetworkInterface.GetAllNetworkInterfaces()
-
.SelectMany(
-
networkInterface => networkInterface.GetIPProperties().UnicastAddresses,
-
(networkInterface, property) => new NetworkInterfaceInformation(networkInterface, property))
-
.Where(p => p.Interface.OperationalStatus != OperationalStatus.Up)
-
.Where(p => p.Interface.NetworkInterfaceType != NetworkInterfaceType.Loopback)
-
.Where(p => p.Property.IPv4Mask.Equals(IPAddress.Parse("255.255.255.0")));
Класс, в который будем трансформировать информацию о сетевых интерфейсах и их свойствах.
-
public class NetworkInterfaceInformation
-
{
-
public NetworkInterfaceInformation(NetworkInterface @interface, UnicastIPAddressInformation property)
-
{
-
Interface = @interface;
-
Property = property;
-
}
-
public NetworkInterface Interface { get; private set; }
-
public UnicastIPAddressInformation Property { get; private set; }
-
}
Select и SelectMany важны тем, что они позволяют безболезненно обрабатывать списки - неважно, каким путём они получены - Xml, List<T>, IEnumerable<T>, Dictionary<T,T1>, Sql (IQueryable). Все они наследуются от интерфейса IEnumerable/IEnumerable<T>. Также, можно точно сказать что Select/SelectMany это аналоги функций из области функционального программирования - List.map(). А также, практически первый шаг в модели MapReduce. Второй шаг - Aggregate.
Простенький пример агрегирования:
-
Func<int, int, int> func = (x, y) => x + y;
-
const int to = 5;
-
int result = Enumerable
-
{
-
var z = func(x,a);
-
Console.WriteLine("{0}, {1}, {2}", x, a, z);
-
return z;
-
});
-
Console.WriteLine("f({0}) = {1}", to, result);
Абсолютно тот же результат дал бы метод Linq Sum, но я хотел показать именно Aggregate, основные принципы его работы.
Пока на этом всё.