Это дополнительный вопрос для общей двумерной плоскости данных с методом подплоскости в C #. Благодаря ответу aepot.
Я пытаюсь реализовать серию методов для улучшения возможностей и функциональности этой двумерной плоскости данных.
Cast
метод, чтобы иметь дело с преобразованием между разными типами.Некоторые статистические функции, в том числе
Max
,Min
,Average
,Contains
,Count
,PopulationVariance
иPopulationStandardDeviation
.Некоторые из тригонометрических функций, вычисляющие результат каждого элемента (сначала преобразуются в двойное), в том числе
Cosine
,Cosecant
,Cotangent
,Secant
,Sine
иTangent
.
[Serializable]
public class Plane<T>
where T : struct
{
public int Width { get; }
public int Height { get; }
public T[,] Grid { get; }
public int Length { get; }
public Plane() : this(1, 1) { }
public Plane(in int width, in int height)
{
Width = width;
Height = height;
Grid = new T[height, width];
Length = Width * Height;
}
public Plane(Plane<T> plane) : this(plane?.Grid ?? throw new ArgumentNullException(nameof(plane))) { }
public Plane(in T[,] sourceGrid)
{
if (ReferenceEquals(sourceGrid, null))
{
throw new ArgumentNullException(nameof(sourceGrid));
}
Height = sourceGrid.GetLength(0);
Width = sourceGrid.GetLength(1);
Length = Width * Height;
Grid = new T[Height, Width];
Array.Copy(sourceGrid, Grid, sourceGrid.Length);
}
public Plane<T2> Cast<T2>()
where T2 : struct
{
T2[,] outputGrid = ConvertAllDetail(this.Grid, x =>
{
return (T2)Convert.ChangeType(x, typeof(T2));
});
return new Plane<T2>(outputGrid);
}
public Plane<TOutput> ConvertAll<TOutput>(in Converter<T, TOutput> converter)
where TOutput : struct
{
return new Plane<TOutput>(ConvertAllDetail(this.Grid, converter));
}
public double Average()
{
return System.Linq.Enumerable.Average(this.Cast<double>().Grid.Cast<double>().ToArray());
}
private static TOutput[,] ConvertAllDetail<TInput, TOutput>(in TInput[,] array, Converter<TInput, TOutput> converter)
where TInput : struct
where TOutput : struct
{
return (TOutput[,])ConvertArray(array, converter);
}
private static Array ConvertArray<TInput, TResult>(in Array array, in Converter<TInput, TResult> converter)
where TInput : struct
where TResult : struct
{
if (ReferenceEquals(array, null))
{
throw new ArgumentNullException(nameof(array));
}
if (ReferenceEquals(converter, null))
{
throw new ArgumentNullException(nameof(converter));
}
long[] dimensions = new long[array.Rank];
for (int i = 0; i < array.Rank; i++)
dimensions[i] = array.GetLongLength(i);
Array result = Array.CreateInstance(typeof(TResult), dimensions);
TResult[] tmp = new TResult[1];
int offset = 0;
int itemSize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(TResult));
foreach (TInput item in array)
{
tmp[0] = converter(item);
Buffer.BlockCopy(tmp, 0, result, offset * itemSize, itemSize);
offset++;
}
return result;
}
public Plane<T> ConcatenateHorizontal(in Plane<T> input)
{
if (ReferenceEquals(input, null))
{
throw new ArgumentNullException(nameof(input));
}
if (this.Height != input.Height)
{
throw new ArgumentException("Height isn't match", nameof(input.Height));
}
var output = new Plane<T>(this.Width + input.Width, this.Height);
for (int row = 0; row < this.Height; row++)
{
Array.Copy(this.Grid, row * this.Width, output.Grid, row * output.Width, this.Width);
Array.Copy(input.Grid, row * input.Width, output.Grid, row * output.Width + this.Width, input.Width);
}
return output;
}
public Plane<T> ConcatenateHorizontalInverse(in Plane<T> input)
{
return input.ConcatenateHorizontal(this);
}
public bool Contains(in T value)
{
return System.Linq.Enumerable.Contains(this.Grid.Cast<T>().ToArray(), value);
}
public Plane<double> Cosine()
{
return this.Cast<double>().ConvertAll(x => Math.Cos(x));
}
public Plane<double> Cosecant()
{
return this.Cast<double>().ConvertAll(x => 1 / Math.Sin(x));
}
public Plane<double> Cotangent()
{
return this.Cast<double>().ConvertAll(x => 1 / Math.Tan(x));
}
public int Count(in Func<T, bool> predicate)
{
return System.Linq.Enumerable.Count(this.Grid.Cast<T>().ToArray(), predicate);
}
public override bool Equals(object obj)
{
return obj is Plane<T> input && this.Width == input.Width && this.Height == input.Height &&
this.Grid.Cast<T>().SequenceEqual(input.Grid.Cast<T>());
}
public double Max()
{
return System.Linq.Enumerable.Max(this.Cast<double>().Grid.Cast<double>().ToArray());
}
public double Min()
{
return System.Linq.Enumerable.Min(this.Cast<double>().Grid.Cast<double>().ToArray());
}
public double PopulationVariance()
{
var avg = this.Average();
double output = 0.0;
var doublePlane = this.Cast<double>();
for (int x = 0; x < this.Width; x++)
{
for (int y = 0; y < this.Height; y++)
{
output += Math.Pow(doublePlane.Grid[y, x] - avg, 2);
}
}
return output / this.Length;
}
public double PopulationStandardDeviation()
{
return Math.Sqrt(this.PopulationVariance());
}
public Plane<double> Secant()
{
return this.Cast<double>().ConvertAll(x => 1 / Math.Cos(x));
}
public Plane<double> Sine()
{
return this.Cast<double>().ConvertAll(x => Math.Sin(x));
}
public Plane<T> SubPlane(in int locationX, in int locationY, in int newWidth, in int newHeight)
{
if (locationX < 0 || locationX >= this.Width)
throw new ArgumentException("Location must be inside the area", nameof(locationX));
if (locationY < 0 || locationY >= this.Height)
throw new ArgumentException("Location must be inside the area", nameof(locationY));
Plane<T> outputPlane = new Plane<T>(newWidth, newHeight);
for (int row = 0; row < newHeight; row++)
{
Array.Copy(this.Grid, (row + locationY) * this.Width + locationX, outputPlane.Grid, row * newWidth, newWidth);
}
return outputPlane;
}
public double Sum()
{
double output = 0.0;
var doublePlane = this.Cast<double>();
for (int x = 0; x < this.Width; x++)
{
for (int y = 0; y < this.Height; y++)
{
output += doublePlane.Grid[y, x];
}
}
return output;
}
public Plane<double> Tangent()
{
return this.Cast<double>().ConvertAll(x => Math.Tan(x));
}
public override string ToString() => $"{nameof(Plane<T>)}<{typeof(T).Name}>[{Height}, {Width}]";
public string ToDelimitedString(in string separator = " ")
{
var sb = new StringBuilder();
string[,] output = new string[this.Height, this.Width];
int maxLength = 0;
for (int row = 0; row < this.Height; row++)
{
for (int column = 0; column < this.Width; column++)
{
string s = this.Grid[row, column].ToString();
output[row, column] = s;
maxLength = Math.Max(maxLength, s.Length);
}
}
for (int row = 0; row < this.Height; row++)
{
for (int column = 0; column < this.Width; column++)
{
sb.Append(output[row, column].PadLeft(maxLength)).Append(separator);
}
sb.Remove(sb.Length - separator.Length, separator.Length).AppendLine();
}
return sb.ToString();
}
public override int GetHashCode()
{
// Based on https://stackoverflow.com/a/61000527/6667035
byte[] encoded = System.Security.Cryptography.SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(this.ToDelimitedString()));
return BitConverter.ToInt32(encoded, 0);
}
// https://stackoverflow.com/a/1145562/6667035
private T CastObject<T>(object input)
{
return (T)input;
}
private T ConvertObject<T>(object input)
{
return (T)Convert.ChangeType(input, typeof(T));
}
}
Тестовые примеры
Тестовые примеры для использования GetHashCode
, Sum
, Max
, Min
, Average
, Contains
, Count
, PopulationVariance
, PopulationStandardDeviation
, Sine
, Cosine
, Tangent
, Cotangent
, Secant
и Cosecant
перечислены ниже.
Plane<int> plane = new Plane<int>(10, 10);
// Set value
for (int x = 0; x < 10; x++)
{
for (int y = 0; y < 10; y++)
{
plane.Grid[y, x] = x + y * 2;
}
}
Console.WriteLine("Print content:");
Console.WriteLine(plane.ToDelimitedString("t"));
Console.WriteLine($"GetHashCode:{plane.GetHashCode()}");
Console.WriteLine();
Console.WriteLine($"Sum:{plane.Sum()}");
Console.WriteLine();
Console.WriteLine($"Max:{plane.Max()}");
Console.WriteLine();
Console.WriteLine($"Min:{plane.Min()}");
Console.WriteLine();
Console.WriteLine($"Average:{plane.Average()}");
Console.WriteLine();
Console.WriteLine($"Contains zero:{plane.Contains(0)}");
Console.WriteLine();
Console.WriteLine($"Count of zero:{plane.Count(x => x == 0)}");
Console.WriteLine();
Console.WriteLine($"PopulationVariance:{plane.PopulationVariance()}");
Console.WriteLine();
Console.WriteLine($"PopulationStandardDeviation:{plane.PopulationStandardDeviation()}");
Console.WriteLine();
Console.WriteLine($"Sine:");
Console.WriteLine(plane.Sine().ToDelimitedString());
Console.WriteLine($"Cosine:");
Console.WriteLine(plane.Cosine().ToDelimitedString());
Console.WriteLine($"Tangent:");
Console.WriteLine(plane.Tangent().ToDelimitedString());
Console.WriteLine($"Cotangent:");
Console.WriteLine(plane.Cotangent().ToDelimitedString());
Console.WriteLine($"Secant:");
Console.WriteLine(plane.Secant().ToDelimitedString());
Console.WriteLine($"Cosecant:");
Console.WriteLine(plane.Cosecant().ToDelimitedString());
Вывод вышеуказанных тестовых случаев.
Print content:
0 1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9 10 11
4 5 6 7 8 9 10 11 12 13
6 7 8 9 10 11 12 13 14 15
8 9 10 11 12 13 14 15 16 17
10 11 12 13 14 15 16 17 18 19
12 13 14 15 16 17 18 19 20 21
14 15 16 17 18 19 20 21 22 23
16 17 18 19 20 21 22 23 24 25
18 19 20 21 22 23 24 25 26 27
GetHashCode:-1863909712
Sum:1350
Max:27
Min:0
Average:13.5
Contains zero:True
Count of zero:1
PopulationVariance:41.25
PopulationStandardDeviation:6.422616289332565
Sine:
0 0.8414709848078965 0.9092974268256817 0.1411200080598672 -0.7568024953079282 -0.9589242746631385 -0.27941549819892586 0.6569865987187891 0.9893582466233818 0.4121184852417566
0.9092974268256817 0.1411200080598672 -0.7568024953079282 -0.9589242746631385 -0.27941549819892586 0.6569865987187891 0.9893582466233818 0.4121184852417566 -0.5440211108893698 -0.9999902065507035
-0.7568024953079282 -0.9589242746631385 -0.27941549819892586 0.6569865987187891 0.9893582466233818 0.4121184852417566 -0.5440211108893698 -0.9999902065507035 -0.5365729180004349 0.4201670368266409
-0.27941549819892586 0.6569865987187891 0.9893582466233818 0.4121184852417566 -0.5440211108893698 -0.9999902065507035 -0.5365729180004349 0.4201670368266409 0.9906073556948704 0.6502878401571168
0.9893582466233818 0.4121184852417566 -0.5440211108893698 -0.9999902065507035 -0.5365729180004349 0.4201670368266409 0.9906073556948704 0.6502878401571168 -0.2879033166650653 -0.9613974918795568
-0.5440211108893698 -0.9999902065507035 -0.5365729180004349 0.4201670368266409 0.9906073556948704 0.6502878401571168 -0.2879033166650653 -0.9613974918795568 -0.7509872467716762 0.14987720966295234
-0.5365729180004349 0.4201670368266409 0.9906073556948704 0.6502878401571168 -0.2879033166650653 -0.9613974918795568 -0.7509872467716762 0.14987720966295234 0.9129452507276277 0.8366556385360561
0.9906073556948704 0.6502878401571168 -0.2879033166650653 -0.9613974918795568 -0.7509872467716762 0.14987720966295234 0.9129452507276277 0.8366556385360561 -0.008851309290403876 -0.8462204041751706
-0.2879033166650653 -0.9613974918795568 -0.7509872467716762 0.14987720966295234 0.9129452507276277 0.8366556385360561 -0.008851309290403876 -0.8462204041751706 -0.9055783620066238 -0.13235175009777303
-0.7509872467716762 0.14987720966295234 0.9129452507276277 0.8366556385360561 -0.008851309290403876 -0.8462204041751706 -0.9055783620066238 -0.13235175009777303 0.7625584504796027 0.956375928404503
Cosine:
1 0.5403023058681398 -0.4161468365471424 -0.9899924966004454 -0.6536436208636119 0.28366218546322625 0.960170286650366 0.7539022543433046 -0.14550003380861354 -0.9111302618846769
-0.4161468365471424 -0.9899924966004454 -0.6536436208636119 0.28366218546322625 0.960170286650366 0.7539022543433046 -0.14550003380861354 -0.9111302618846769 -0.8390715290764524 0.004425697988050785
-0.6536436208636119 0.28366218546322625 0.960170286650366 0.7539022543433046 -0.14550003380861354 -0.9111302618846769 -0.8390715290764524 0.004425697988050785 0.8438539587324921 0.9074467814501962
0.960170286650366 0.7539022543433046 -0.14550003380861354 -0.9111302618846769 -0.8390715290764524 0.004425697988050785 0.8438539587324921 0.9074467814501962 0.1367372182078336 -0.7596879128588213
-0.14550003380861354 -0.9111302618846769 -0.8390715290764524 0.004425697988050785 0.8438539587324921 0.9074467814501962 0.1367372182078336 -0.7596879128588213 -0.9576594803233847 -0.27516333805159693
-0.8390715290764524 0.004425697988050785 0.8438539587324921 0.9074467814501962 0.1367372182078336 -0.7596879128588213 -0.9576594803233847 -0.27516333805159693 0.6603167082440802 0.9887046181866692
0.8438539587324921 0.9074467814501962 0.1367372182078336 -0.7596879128588213 -0.9576594803233847 -0.27516333805159693 0.6603167082440802 0.9887046181866692 0.40808206181339196 -0.5477292602242684
0.1367372182078336 -0.7596879128588213 -0.9576594803233847 -0.27516333805159693 0.6603167082440802 0.9887046181866692 0.40808206181339196 -0.5477292602242684 -0.9999608263946371 -0.5328330203333975
-0.9576594803233847 -0.27516333805159693 0.6603167082440802 0.9887046181866692 0.40808206181339196 -0.5477292602242684 -0.9999608263946371 -0.5328330203333975 0.424179007336997 0.9912028118634736
0.6603167082440802 0.9887046181866692 0.40808206181339196 -0.5477292602242684 -0.9999608263946371 -0.5328330203333975 0.424179007336997 0.9912028118634736 0.6469193223286404 -0.2921388087338362
Tangent:
0 1.5574077246549023 -2.185039863261519 -0.1425465430742778 1.1578212823495777 -3.380515006246586 -0.29100619138474915 0.8714479827243188 -6.799711455220379 -0.45231565944180985
-2.185039863261519 -0.1425465430742778 1.1578212823495777 -3.380515006246586 -0.29100619138474915 0.8714479827243188 -6.799711455220379 -0.45231565944180985 0.6483608274590866 -225.95084645419513
1.1578212823495777 -3.380515006246586 -0.29100619138474915 0.8714479827243188 -6.799711455220379 -0.45231565944180985 0.6483608274590866 -225.95084645419513 -0.6358599286615808 0.4630211329364896
-0.29100619138474915 0.8714479827243188 -6.799711455220379 -0.45231565944180985 0.6483608274590866 -225.95084645419513 -0.6358599286615808 0.4630211329364896 7.2446066160948055 -0.8559934009085188
-6.799711455220379 -0.45231565944180985 0.6483608274590866 -225.95084645419513 -0.6358599286615808 0.4630211329364896 7.2446066160948055 -0.8559934009085188 0.3006322420239034 3.49391564547484
0.6483608274590866 -225.95084645419513 -0.6358599286615808 0.4630211329364896 7.2446066160948055 -0.8559934009085188 0.3006322420239034 3.49391564547484 -1.1373137123376869 0.15158947061240008
-0.6358599286615808 0.4630211329364896 7.2446066160948055 -0.8559934009085188 0.3006322420239034 3.49391564547484 -1.1373137123376869 0.15158947061240008 2.237160944224742 -1.5274985276366035
7.2446066160948055 -0.8559934009085188 0.3006322420239034 3.49391564547484 -1.1373137123376869 0.15158947061240008 2.237160944224742 -1.5274985276366035 0.00885165604168446 1.5881530833912738
0.3006322420239034 3.49391564547484 -1.1373137123376869 0.15158947061240008 2.237160944224742 -1.5274985276366035 0.00885165604168446 1.5881530833912738 -2.1348966977217008 -0.13352640702153587
-1.1373137123376869 0.15158947061240008 2.237160944224742 -1.5274985276366035 0.00885165604168446 1.5881530833912738 -2.1348966977217008 -0.13352640702153587 1.1787535542062797 -3.273703800428119
Cotangent:
∞ 0.6420926159343306 -0.45765755436028577 -7.015252551434534 0.8636911544506165 -0.2958129155327455 -3.436353004180128 1.1475154224051356 -0.1470650639494805 -2.210845410999195
-0.45765755436028577 -7.015252551434534 0.8636911544506165 -0.2958129155327455 -3.436353004180128 1.1475154224051356 -0.1470650639494805 -2.210845410999195 1.5423510453569202 -0.0044257413313241135
0.8636911544506165 -0.2958129155327455 -3.436353004180128 1.1475154224051356 -0.1470650639494805 -2.210845410999195 1.5423510453569202 -0.0044257413313241135 -1.5726734063976893 2.159728636267592
-3.436353004180128 1.1475154224051356 -0.1470650639494805 -2.210845410999195 1.5423510453569202 -0.0044257413313241135 -1.5726734063976893 2.159728636267592 0.13803371984040846 -1.1682333052318372
-0.1470650639494805 -2.210845410999195 1.5423510453569202 -0.0044257413313241135 -1.5726734063976893 2.159728636267592 0.13803371984040846 -1.1682333052318372 3.326323195635449 0.2862118326454602
1.5423510453569202 -0.0044257413313241135 -1.5726734063976893 2.159728636267592 0.13803371984040846 -1.1682333052318372 3.326323195635449 0.2862118326454602 -0.8792648757786926 6.596764247280111
-1.5726734063976893 2.159728636267592 0.13803371984040846 -1.1682333052318372 3.326323195635449 0.2862118326454602 -0.8792648757786926 6.596764247280111 0.4469951089489167 -0.6546651154860575
0.13803371984040846 -1.1682333052318372 3.326323195635449 0.2862118326454602 -0.8792648757786926 6.596764247280111 0.4469951089489167 -0.6546651154860575 112.9732103564319 0.6296622224002758
3.326323195635449 0.2862118326454602 -0.8792648757786926 6.596764247280111 0.4469951089489167 -0.6546651154860575 112.9732103564319 0.6296622224002758 -0.46840673886805423 -7.489155308722675
-0.8792648757786926 6.596764247280111 0.4469951089489167 -0.6546651154860575 112.9732103564319 0.6296622224002758 -0.46840673886805423 -7.489155308722675 0.8483537516655512 -0.305464410026718
Secant:
1 1.8508157176809255 -2.402997961722381 -1.0101086659079939 -1.5298856564663974 3.5253200858160887 1.0414819265951076 1.3264319004737049 -6.87285063669037 -1.097537906304962
-2.402997961722381 -1.0101086659079939 -1.5298856564663974 3.5253200858160887 1.0414819265951076 1.3264319004737049 -6.87285063669037 -1.097537906304962 -1.1917935066878957 225.95305931402496
-1.5298856564663974 3.5253200858160887 1.0414819265951076 1.3264319004737049 -6.87285063669037 -1.097537906304962 -1.1917935066878957 225.95305931402496 1.185039176093985 1.1019929988642352
1.0414819265951076 1.3264319004737049 -6.87285063669037 -1.097537906304962 -1.1917935066878957 225.95305931402496 1.185039176093985 1.1019929988642352 7.313297821227071 -1.316330012724367
-6.87285063669037 -1.097537906304962 -1.1917935066878957 225.95305931402496 1.185039176093985 1.1019929988642352 7.313297821227071 -1.316330012724367 -1.044212499898521 -3.634205076449851
-1.1917935066878957 225.95305931402496 1.185039176093985 1.1019929988642352 7.313297821227071 -1.316330012724367 -1.044212499898521 -3.634205076449851 1.5144248017882336 1.01142442505634
1.185039176093985 1.1019929988642352 7.313297821227071 -1.316330012724367 -1.044212499898521 -3.634205076449851 1.5144248017882336 1.01142442505634 2.4504875209567056 -1.8257195162269564
7.313297821227071 -1.316330012724367 -1.044212499898521 -3.634205076449851 1.5144248017882336 1.01142442505634 2.4504875209567056 -1.8257195162269564 -1.0000391751399944 -1.876760564452805
-1.044212499898521 -3.634205076449851 1.5144248017882336 1.01142442505634 2.4504875209567056 -1.8257195162269564 -1.0000391751399944 -1.876760564452805 2.357495261913165 1.0088752655170414
1.5144248017882336 1.01142442505634 2.4504875209567056 -1.8257195162269564 -1.0000391751399944 -1.876760564452805 2.357495261913165 1.0088752655170414 1.5457878061215053 -3.423030320189629
Cosecant:
∞ 1.1883951057781212 1.0997501702946164 7.086167395737187 -1.3213487088109024 -1.0428352127714058 -3.5788995472544056 1.5221010625637303 1.010756218400097 2.426486643551989
1.0997501702946164 7.086167395737187 -1.3213487088109024 -1.0428352127714058 -3.5788995472544056 1.5221010625637303 1.010756218400097 2.426486643551989 -1.8381639608896658 -1.000009793545209
-1.3213487088109024 -1.0428352127714058 -3.5788995472544056 1.5221010625637303 1.010756218400097 2.426486643551989 -1.8381639608896658 -1.000009793545209 -1.8636795977824385 2.3800058366134884
-3.5788995472544056 1.5221010625637303 1.010756218400097 2.426486643551989 -1.8381639608896658 -1.000009793545209 -1.8636795977824385 2.3800058366134884 1.0094817025647271 1.5377805615408537
1.010756218400097 2.426486643551989 -1.8381639608896658 -1.000009793545209 -1.8636795977824385 2.3800058366134884 1.0094817025647271 1.5377805615408537 -3.4733882595849295 -1.0401524951401468
-1.8381639608896658 -1.000009793545209 -1.8636795977824385 2.3800058366134884 1.0094817025647271 1.5377805615408537 -3.4733882595849295 -1.0401524951401468 -1.3315805352205023 6.672128486037505
-1.8636795977824385 2.3800058366134884 1.0094817025647271 1.5377805615408537 -3.4733882595849295 -1.0401524951401468 -1.3315805352205023 6.672128486037505 1.0953559364080034 1.1952348779358697
1.0094817025647271 1.5377805615408537 -3.4733882595849295 -1.0401524951401468 -1.3315805352205023 6.672128486037505 1.0953559364080034 1.1952348779358697 -112.97763609776322 -1.181725227926549
-3.4733882595849295 -1.0401524951401468 -1.3315805352205023 6.672128486037505 1.0953559364080034 1.1952348779358697 -112.97763609776322 -1.181725227926549 -1.104266667529635 -7.555623550585948
-1.3315805352205023 6.672128486037505 1.0953559364080034 1.1952348779358697 -112.97763609776322 -1.181725227926549 -1.104266667529635 -7.555623550585948 1.3113748846020408 1.0456139372602924
Все предложения приветствуются.
Сводная информация:
На какой вопрос это продолжение?
Общая двумерная плоскость данных с методом подплоскости в C #
Какие изменения были внесены в код с момента последнего вопроса?
Попытка реализовать метод серии для улучшения возможностей и функциональности двумерной плоскости данных, включая
GetHashCode
,Sum
,Max
,Min
,Average
,Contains
,Count
,PopulationVariance
,PopulationStandardDeviation
,Sine
,Cosine
,Tangent
,Cotangent
,Secant
иCosecant
.Почему запрашивается новый обзор?
Если есть какие-либо проблемы с потенциальным недостатком или ненужными накладными расходами реализованных методов, сообщите мне.