diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs
index 7b788f2e1..cb649bbb1 100644
--- a/Configuration/GlobalAssemblyInfo.cs
+++ b/Configuration/GlobalAssemblyInfo.cs
@@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "8";
public const string Build = "0";
- public const string Revision = "2951";
+ public const string Revision = "2953";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;
diff --git a/Configuration/Version.defs b/Configuration/Version.defs
index cde9c1f76..5bbcd0bcf 100644
--- a/Configuration/Version.defs
+++ b/Configuration/Version.defs
@@ -1,4 +1,4 @@
%MINOR%=8
-%REVISION%=2951
+%REVISION%=2953
%COREVERSION%=0
%MAJOR%=3
diff --git a/PABCNetHelp/Common/main.html b/PABCNetHelp/Common/main.html
index 2849dfb3a..b79dc9dff 100644
--- a/PABCNetHelp/Common/main.html
+++ b/PABCNetHelp/Common/main.html
@@ -88,8 +88,8 @@ Visual Basic.NET,
çàïèñè, ìîæíî ïîëüçîâàòüñÿ âñòðîåííûìè â ñòàíäàðòíûå òèïû ìåòîäàìè è ñâîéñòâàìè, ïàìÿòü ïîä îáúåêòû óïðàâëÿåòñÿ
ñáîðùèêîì ìóñîðà è
íå òðåáóåò ÿâíîãî îñâîáîæäåíèÿ, ìíîæåñòâà
-set ìîãóò áûòü
-ñîçäàíû íà îñíîâå ïðîèçâîëüíûõ òèïîâ, ââåäåí îïåðàòîðû foreach , ïåðåìåííûå
+set ìîãóò áûòü ñîçäàíû íà îñíîâå ïðîèçâîëüíûõ òèïîâ, ââåäåí
+îïåðàòîð foreach , ïåðåìåííûå
öèêëîâ for è foreach
ìîæíî îïèñûâàòü íåïîñðåäñòâåííî â çàãîëîâêå öèêëà, èìåþòñÿ
îáîáùåííûå êëàññû è ïîäïðîãðàììû (generics),
diff --git a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for IDictionary.html b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for IDictionary.html
index 8d06d3f7d..b98f14845 100644
--- a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for IDictionary.html
+++ b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for IDictionary.html
@@ -9,6 +9,8 @@
Âîçâðàùàåò ñëîâàðü, ñîïîñòàâëÿþùèé êëþ÷ó ãðóïïû ðåçóëüòàò ãðóïïîâîé îïåðàöèè
function EachCount<Key,Source>(Self: sequence of System.Linq.IGrouping<Key,Source>): Dictionary<Key,integer>;
Âîçâðàùàåò ñëîâàðü, ñîïîñòàâëÿþùèé êëþ÷ó ãðóïïû êîëè÷åñòâî ýëåìåíòîâ ñ äàííûì êëþ÷îì
+function EachCount<T>(Self: sequence of T): Dictionary<T,integer>;
+ Âîçâðàùàåò ÷àñòîòíûé ñëîâàðü îáúåêòîâ ïîñëåäîâàòåëüíîñòè
function Get<Key, Value>(Self: IDictionary<Key, Value>; K: Key): Value;
Âîçâðàùàåò â ñëîâàðå çíà÷åíèå, ñâÿçàííîå ñ óêàçàííûì êëþ÷îì, à åñëè òàêîãî êëþ÷à íåò, òî çíà÷åíèå ïî óìîë÷àíèþ
procedure operator-=<Key,Value>(Self: IDictionary<Key,Value>; k: Key);
diff --git a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for array of T.html b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for array of T.html
index 69017439e..19096bc4b 100644
--- a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for array of T.html
+++ b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for array of T.html
@@ -28,6 +28,7 @@
+
Ìåòîäû ðàñøèðåíèÿ îäíîìåðíûõ äèíàìè÷åñêèõ ìàññèâîâ
@@ -133,6 +134,12 @@
Ñîðòèðóåò ìàññèâ ïî âîçðàñòàíèþ
procedure Sort<T>(Self: array of T; cmp: (T,T) ->integer);
Ñîðòèðóåò ìàññèâ ïî âîçðàñòàíèþ, èñïîëüçóÿ cmp â êà÷åñòâå ôóíêöèè ñðàâíåíèÿ ýëåìåíòîâ
+procedure Sort<T,T1>(Self: array of T; keySelector: T -> T1);
+ Ñîðòèðóåò ìàññèâ ïî âîçðàñòàíèþ ïî êëþ÷ó
+procedure SortDescending<T>(Self: array of T);
+ Ñîðòèðóåò ìàññèâ ïî óáûâàíèþ
+procedure SortDescending<T,T1>(Self: array of T; keySelector: T -> T1);
+ Ñîðòèðóåò ìàññèâ ïî óáûâàíèþ ïî êëþ÷ó
procedure Transform<T>(Self: array of T; f: T->T);
Ïðåîáðàçóåò ýëåìåíòû ìàññèâà ïî çàäàííîìó ïðàâèëó
procedure Transform<T>(Self: array of T; f: (T,integer)->T);
diff --git a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for real.html b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for real.html
index acaf707f4..7c67ee22b 100644
--- a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for real.html
+++ b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for real.html
@@ -1,8 +1,10 @@
+
+
@@ -15,12 +17,16 @@
Ìåòîäû ðàñøèðåíèÿ òèïà real
function Between(Self: real; a, b: real): boolean;
Âîçâðàùàåò True åñëè çíà÷åíèå íàõîäèòñÿ ìåæäó äâóìÿ äðóãèìè
+function Ceil(Self: real): integer;
+ Âîçâðàùàåò íàìåíüøåå öåëîå, áîëüøåå èëè ðàâíîå âåùåñòâåííîìó ÷èñëó
function Clamp(Self: real; bottom,top: real): real;
Âîçâðàùàåò ÷èñëî, îãðàíè÷åííîå äèàïàçîíîì îò bottom äî top âêëþ÷èòåëüíî
function ClampBottom(Self: real; bottom: real): real;
Âîçâðàùàåò ÷èñëî, îãðàíè÷åííîå âåëè÷èíîé bottom ñíèçó
function ClampTop(Self: real; top: real): real;
Âîçâðàùàåò ÷èñëî, îãðàíè÷åííîå âåëè÷èíîé top ñâåðõó
+function Floor(Self: real): integer;
+ Âîçâðàùàåò íàèáîëüøåå öåëîå, ìåíüøåå èëè ðàâíîå âåùåñòâåííîìó ÷èñëó
function InRange(Self: real; a,b: real): boolean;
Âîçâðàùàåò True åñëè çíà÷åíèå íàõîäèòñÿ ìåæäó äâóìÿ äðóãèìè
function Round(Self: real): integer;
diff --git a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Subroutines for array of T.html b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Subroutines for array of T.html
index 10fcad23c..167d61b19 100644
--- a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Subroutines for array of T.html
+++ b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Subroutines for array of T.html
@@ -55,15 +55,23 @@
Ñîðòèðóåò äèíàìè÷åñêèé ìàññèâ ïî êðèòåðèþ ñîðòèðîâêè, çàäàâàåìîìó ôóíêöèåé ñðàâíåíèÿ cmp
procedure Sort<T>(a: array of T; less: (T,T)->boolean);
Ñîðòèðóåò äèíàìè÷åñêèé ìàññèâ ïî êðèòåðèþ ñîðòèðîâêè, çàäàâàåìîìó ôóíêöèåé ñðàâíåíèÿ less
+procedure Sort<T,T1>(var a: array of T; keySelector: T->T1);
+ Ñîðòèðóåò äèíàìè÷åñêèé ìàññèâ ïî êëþ÷ó
procedure Sort<T>(l: List<T>);
Ñîðòèðóåò ñïèñîê ïî âîçðàñòàíèþ
procedure Sort<T>(l: List<T>; cmp: (T,T)->integer);
Ñîðòèðóåò ñïèñîê ïî êðèòåðèþ ñîðòèðîâêè, çàäàâàåìîìó ôóíêöèåé ñðàâíåíèÿ cmp
procedure Sort<T>(l: List<T>; less: (T,T)->boolean);
Ñîðòèðóåò ñïèñîê ïî êðèòåðèþ ñîðòèðîâêè, çàäàâàåìîìó ôóíêöèåé ñðàâíåíèÿ less
+procedure Sort<T,T1>(var l: List<T>; keySelector: T->T1);
+ Ñîðòèðóåò ñïèñîê ïî âîçðàñòàíèþ ïî êëþ÷ó
procedure SortDescending<T>(a: array of T);
Ñîðòèðóåò äèíàìè÷åñêèé ìàññèâ ïî óáûâàíèþ
+procedure SortDescending<T,T1>(var a: array of T; keySelector: T->T1);
+ Ñîðòèðóåò äèíàìè÷åñêèé ìàññèâ ïî óáûâàíèþ ïî êëþ÷ó
procedure SortDescending<T>(l: List<T>);
Ñîðòèðóåò ñïèñîê ïî óáûâàíèþ
+procedure SortDescending<T,T1>(var l: List<T>; keySelector: T->T1);
+ Ñîðòèðóåò ñïèñîê ïî óáûâàíèþ ïî êëþ÷ó
\ No newline at end of file
diff --git a/Parsers/PascalABCParserNewSaushkin/PABC.tags b/Parsers/PascalABCParserNewSaushkin/PABC.tags
index f0c899a99..0449a99c2 100644
--- a/Parsers/PascalABCParserNewSaushkin/PABC.tags
+++ b/Parsers/PascalABCParserNewSaushkin/PABC.tags
@@ -286,7 +286,6 @@
-
@@ -306,7 +305,6 @@
-
diff --git a/Parsers/PascalABCParserNewSaushkin/PABC.ymc b/Parsers/PascalABCParserNewSaushkin/PABC.ymc
index aebf9da14..ba75d29ce 100644
--- a/Parsers/PascalABCParserNewSaushkin/PABC.ymc
+++ b/Parsers/PascalABCParserNewSaushkin/PABC.ymc
@@ -340,6 +340,9 @@ script=
+
+
+
diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt
index c23d45083..3e9b5d700 100644
--- a/Release/pabcversion.txt
+++ b/Release/pabcversion.txt
@@ -1 +1 @@
-3.8.0.2951
+3.8.0.2953
diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh
index c9bef9e4a..414e14737 100644
--- a/ReleaseGenerators/PascalABCNET_version.nsh
+++ b/ReleaseGenerators/PascalABCNET_version.nsh
@@ -1 +1 @@
-!define VERSION '3.8.0.2951'
+!define VERSION '3.8.0.2953'
diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas
index 2e7f3c4f4..f84050402 100644
--- a/TestSuite/CompilationSamples/PABCSystem.pas
+++ b/TestSuite/CompilationSamples/PABCSystem.pas
@@ -2123,16 +2123,24 @@ procedure Sort(a: array of T);
procedure Sort(a: array of T; cmp: (T,T)->integer);
/// Сортирует динамиче�кий ма��ив по критерию �ортировки, задаваемому функцией �равнени� less
procedure Sort(a: array of T; less: (T,T)->boolean);
+/// Сортирует динамиче�кий ма��ив по ключу
+procedure Sort(var a: array of T; keySelector: T->T1);
/// Сортирует �пи�ок по возра�танию
procedure Sort(l: List);
/// Сортирует �пи�ок по критерию �ортировки, задаваемому функцией �равнени� cmp
procedure Sort(l: List; cmp: (T,T)->integer);
/// Сортирует �пи�ок по критерию �ортировки, задаваемому функцией �равнени� less
procedure Sort(l: List; less: (T,T)->boolean);
+/// Сортирует �пи�ок по возра�танию по ключу
+procedure Sort(var l: List; keySelector: T->T1);
/// Сортирует динамиче�кий ма��ив по убыванию
procedure SortDescending(a: array of T);
+/// Сортирует динамиче�кий ма��ив по убыванию по ключу
+procedure SortDescending(var a: array of T; keySelector: T->T1);
/// Сортирует �пи�ок по убыванию
procedure SortDescending(l: List);
+/// Сортирует �пи�ок по убыванию по ключу
+procedure SortDescending(var l: List; keySelector: T->T1);
/// Измен�ет пор�док �лементов в динамиче�ком ма��иве на противоположный
procedure Reverse(a: array of T);
/// Измен�ет пор�док �лементов на противоположный в диапазоне динамиче�кого ма��ива длины count, начина� � индек�а index
@@ -8585,11 +8593,21 @@ begin
System.Array.Sort(a, (x, y)-> less(x, y) ? -1 : (less(y, x) ? 1 : 0));
end;
+procedure Sort(var a: array of T; keySelector: T->T1);
+begin
+ a := a.OrderBy(x->keySelector(x)).ToArray;
+end;
+
procedure Sort(l: List);
begin
l.Sort();
end;
+procedure Sort(var l: List; keySelector: T->T1);
+begin
+ l := l.OrderBy(x->keySelector(x)).ToList;
+end;
+
procedure Sort(l: List; cmp: (T,T)->integer);
begin
l.Sort(cmp);
@@ -8606,12 +8624,22 @@ begin
Reverse(a);
end;
+procedure SortDescending(var a: array of T; keySelector: T->T1);
+begin
+ a := a.OrderByDescending(x->keySelector(x)).ToArray;
+end;
+
procedure SortDescending(l: List);
begin
Sort(l);
Reverse(l);
end;
+procedure SortDescending(var l: List; keySelector: T->T1);
+begin
+ l := l.OrderByDescending(x->keySelector(x)).ToList;
+end;
+
procedure Reverse(a: array of T);
begin
System.Array.Reverse(a);
@@ -11797,12 +11825,33 @@ begin
System.Array.Sort(Self);
end;
+/// Сортирует ма��ив по убыванию
+procedure SortDescending(Self: array of T); extensionmethod;
+begin
+ System.Array.Sort(Self);
+ Reverse(Self);
+end;
+
/// Сортирует ма��ив по возра�танию, и�пользу� cmp в каче�тве функции �равнени� �лементов
procedure Sort(Self: array of T; cmp: (T,T) ->integer); extensionmethod;
begin
System.Array.Sort(Self, cmp);
end;
+/// Сортирует ма��ив по возра�танию по ключу
+procedure Sort(Self: array of T; keySelector: T -> T1); extensionmethod;
+begin
+ var a := Self.OrderBy(keySelector).ToArray;
+ System.Array.Copy(a,Self,a.Length);
+end;
+
+/// Сортирует ма��ив по убыванию по ключу
+procedure SortDescending(Self: array of T; keySelector: T -> T1); extensionmethod;
+begin
+ var a := Self.OrderByDescending(keySelector).ToArray;
+ System.Array.Copy(a,Self,a.Length);
+end;
+
/// Возвращает индек� по�леднего �лемента ма��ива
function High(Self: System.Array); extensionmethod := High(Self);
diff --git a/bin/PascalABCNET.chm b/bin/PascalABCNET.chm
index eb0ec9aae..5a42c7a36 100644
Binary files a/bin/PascalABCNET.chm and b/bin/PascalABCNET.chm differ