pascalabcnet/bin/PT4/Lib/PT4LinqObj[PascalABC].txt
2015-08-31 21:07:40 +03:00

155 lines
4.7 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[4]
// Абрамян М.Э. ТЕХНОЛОГИЯ LINQ НА ПРИМЕРАХ. М.: ДМК-Пресс, 2014.
// Глава 6. Примеры решения задач из группы LinqObj
// 6.1. Простое задание на обработку отдельной последовательности
// LinqObj4: правильное решение (с.191, внизу)
begin
Task('LinqObj4');
var r := ReadAllLines(ReadString)
.Select(e ->
begin
var s := e.Split(' ');
result := new class (
hours := StrToInt(s[2]),
code := StrToInt(s[3])
);
end)
.GroupBy(e -> e.code,
(k, ee) -> new class(k, sum := ee.Sum(c -> c.hours) ))
.OrderByDescending(e -> e.sum).ThenBy(e -> e.k)
.Select(e -> e.sum + ' ' + e.k);
WriteAllLines(ReadString, r);
end.
[41]
// Абрамян М.Э. ТЕХНОЛОГИЯ LINQ НА ПРИМЕРАХ. М.: ДМК-Пресс, 2014.
// Глава 6. Примеры решения задач из группы LinqObj
// 6.2. Более сложные задания на обработку отдельных последовательностей
// LinqObj41: правильное решение (с.196)
begin
Task('LinqObj41');
var m := ReadInteger;
var r := ReadAllLines(ReadString)
.Select(e ->
begin
var s := e.Split(' ');
result := new class (
brand := StrToInt(s[0]),
street := s[1],
price := StrToInt(s[3])
);
end)
.Where(e -> e.brand = m)
.GroupBy(e -> e.street,
(k, ee) -> new class ( street := k, max := ee.Max(e -> e.price) ))
.OrderBy(e -> e.max).ThenBy(e -> e.street)
.Select(e -> e.max + ' ' + e.street)
.DefaultIfEmpty('Нет');
WriteAllLines(ReadString, r);
end.
[61]
// Абрамян М.Э. ТЕХНОЛОГИЯ LINQ НА ПРИМЕРАХ. М.: ДМК-Пресс, 2014.
// Глава 6. Примеры решения задач из группы LinqObj
// 6.2. Более сложные задания на обработку отдельных последовательностей
// LinqObj61: правильное решение (с.199-200)
begin
Task('LinqObj61');
var subjects : array of string := ( 'Алгебра', 'Геометрия', 'Информатика' );
var culture := new System.Globalization.CultureInfo('en-US');
var r := ReadAllLines(ReadString)
.Select(e ->
begin
var s := e.Split(' ');
result := new class
(
name := s[0] + ' ' + s[1],
subj := s[3],
mark := StrToInt(s[4])
);
end)
.GroupBy(e -> e.name, (k, ee) -> new class
(
name := k,
avrs := subjects
.GroupJoin(ee, s -> s, e -> e.subj,
(s1, ee1) -> ee1.Select(e1 -> e1.mark)
.DefaultIfEmpty().Average())
))
.OrderBy(e -> e.name)
.Select(e -> e.name + e.avrs.Aggregate('',
(a, d) -> a + ' ' + d.ToString('f2', culture)));
WriteAllLines(ReadString, r);
end.
[98]
// Абрамян М.Э. ТЕХНОЛОГИЯ LINQ НА ПРИМЕРАХ. М.: ДМК-Пресс, 2014.
// Глава 6. Примеры решения задач из группы LinqObj
// 6.3. Обработка взаимосвязанных последовательностей
// LinqObj98: правильное решение (с.215, вверху)
begin
Task('LinqObj98');
var B := ReadAllLines(ReadString)
.Select(e ->
begin
var s := e.Split(' ');
result := new class
(
art := s[1],
cat := s[2]
);
end);
var C := ReadAllLines(ReadString)
.Select(e ->
begin
var s := e.Split(' ');
result := new class
(
discount := StrToInt(s[0]),
code := s[1],
shop := s[2]
);
end);
var D := ReadAllLines(ReadString)
.Select(e ->
begin
var s := e.Split(' ');
result := new class
(
art := s[0],
price := StrToInt(s[1]),
shop := s[2]
);
end);
var E := ReadAllLines(ReadString)
.Select(e ->
begin
var s := e.Split(' ');
result := new class
(
code := s[0],
art := s[1],
shop := s[2]
);
end);
var discounts := E.Join(B, e1 -> e1.art, e2 -> e2.art,
(e1, e2) -> new class ( e1.code, e1.art, e1.shop, e2.cat ))
.Join(D, e1 -> e1.art + e1.shop, e2 -> e2.art + e2.shop,
(e1, e2) -> new class ( e1.code, e1.shop, e1.cat, e2.price ))
.GroupJoin(C, e1 -> e1.code + e1.shop, e2 -> e2.code + e2.shop,
(e1, ee2) -> new class
(
cat_shop := e1.cat + ' ' + e1.shop,
discount := ee2.Select(e -> e.discount)
.FirstOrDefault() * e1.price div 100
));
var cats := B.GroupBy(e -> e.cat, (k, ee) -> k);
var shops := E.GroupBy(e -> e.shop, (k, ee) -> k);
var r := cats
.SelectMany(e1 -> shops.Select(e2 -> e1 + ' ' + e2))
.OrderBy(e -> e)
.GroupJoin(discounts, e1 -> e1, e2 -> e2.cat_shop,
(e1, ee2) -> e1 + ' ' +
IntToStr(ee2.Select(e -> e.discount).DefaultIfEmpty(-1).Sum()));
WriteAllLines(ReadString, r);
end.