День сто восьмой. #ЗаметкиНаПолях
LINQ. Продолжение
Основные примеры
1. Ключевые компоненты —
Продолжение следует…
Источник: https://docs.microsoft.com/en-us/dotnet/standard/using-linq
LINQ. Продолжение
Основные примеры
1. Ключевые компоненты —
Where
, Select
и Aggregate
:// Фильтрация списка (выбор овчарок из списка собак)2. Спрямление списка списков:
// API
var shepards = dogs.Where(dog => dog.Breed == DogBreed.Shepard);
// Запрос
var queryShepards = from dog in dogs
where dog.Breed == DogBreed.Shepard
select dog;
// Отображение списка объектов типа A в список объектов типа B
// API
var cats = dogs.Select(dog => dog.TurnIntoACat());
// Запрос
var queryCats = from dog in dogs
select dog.TurnIntoACat();
// Суммирование длин строк из набора
int sumOfStrings = strings.Aggregate(0, (s1, s2) => s1 + s2.Length);
// Преобразование списка собачьих питомников в единый список собак из всех питомников3. Объединение/пересечение двух наборов с пользовательским блоком сравнения (используется объект, реализующий
var allDogsFromKennels = kennels.SelectMany(kennel => kennel.Dogs);
IEqualityComparer<T>
, для сравнения объектов между собой):// Получаем всех короткошёрстных собак из двух питомников4. Упорядочение набора:
var shortHairedDogs = kennel1.Dogs.Union(kennel2.Dogs, new HairComparer());
…
public class HairComparer : IEqualityComparer<Dog> {…}
// Получаем волонтёров, работающих в обоих благотворительных обществах
var volunteers = humaneSociety1.Volunteers.Intersect(humaneSociety2.Volunteers, new VolunteerTimeComparer());
// Получаем пути движения, упорядоченные сначала по отсутствию платных участков, затем по времени в пути5. А этот метод расширения использует отражение, чтобы вывести набор открытых свойств экземпляра, имеющих те же значения, что и у другого экземпляра:
var results = DirectionsProcessor.GetDirections(start, end)
.OrderBy(direction => direction.HasNoTolls)
.ThenBy(direction => direction.EstimatedTime);
public static class PropExtensionsНайдём одинаковые свойства двух экземпляров класса
{
public static IEnumerable<PropertyInfo> PublicEqualProps<T>(this T self, T to, params string[] ignore) where T : class
{
if (self == null || to == null)
return null;
// Выбирает свойства с одинаковыми значениями, не входящие в ignore, в набор свойств
var equalProps = from property in typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance)
where !ignore.Contains(property.Name)
let selfValue = property.GetValue(self, null)
let toValue = property.GetValue(to, null)
where !Equals(selfValue, toValue)
select property;
return equalProps;
}
}
Person
:var male = new Person {Вывод:
Age = 41,
FirstName = "John",
LastName = "Smith",
Male = true
};
var female = new Person {
Age = 41,
FirstName = "Jane",
LastName = "Smith",
Male = false
};
foreach(var prop in male.PublicEqualProps(female))
Console.WriteLine(prop.Name);
AgeПолный список примеров можно скачать здесь https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b
LastName
Продолжение следует…
Источник: https://docs.microsoft.com/en-us/dotnet/standard/using-linq