Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions homework_16_05_25/MyLinq/.editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[*.cs]

# SA1636: File header copyright text should match
dotnet_diagnostic.SA1636.severity = none

# SA1600: Elements should be documented
dotnet_diagnostic.SA1600.severity = none

# SA1633: File should have header
dotnet_diagnostic.SA1633.severity = none
31 changes: 31 additions & 0 deletions homework_16_05_25/MyLinq/MyLinq.Tests/MyLinq.Tests.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<LangVersion>latest</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.2" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
<PackageReference Include="NUnit" Version="4.2.2" />
<PackageReference Include="NUnit.Analyzers" Version="4.4.0" />
<PackageReference Include="NUnit3TestAdapter" Version="4.6.0" />
<PackageReference Include="StyleCop.Analyzers" Version="1.2.0-beta.556">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\MyLinq\MyLinq.csproj" />
</ItemGroup>

<ItemGroup>
<Using Include="NUnit.Framework" />
</ItemGroup>

</Project>
86 changes: 86 additions & 0 deletions homework_16_05_25/MyLinq/MyLinq.Tests/SequencesTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
namespace MyLinq.Tests;

public class SequencesTest
{
private int[] array = new int[] { 1, 2, 3, 4, 5 };

[Test]
public void GetPrimesTest()
{
var primeNumbers = new int[] { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 };
var counter = 0;
foreach (var item in Sequences.GetPrimes())
{
if (counter == primeNumbers.Length)
{
break;
}

if (item != primeNumbers[counter])
{
Assert.Fail();
}

counter++;
}

Assert.Pass();
}

[Test]
public void TakeTest()
{
var expected = new[] { 1, 2, 3 };
var actual = this.array.Take(3);

Assert.That(expected, Is.EqualTo(actual));
}

[Test]
public void TakeNullReferenceExceptionTest()
{
IEnumerable<int>? nullSequence = null;
Assert.Throws<NullReferenceException>(()
=> nullSequence!.Take(1).ToList());
}

[Test]
public void TakeArgumentOutOfRangeExceptionTest()
{
Assert.Throws<ArgumentOutOfRangeException>(()
=> this.array.Take(-1).ToList());
}

[Test]
public void SkipTest()
{
var expected = new[] { 3, 4, 5 };
var actual = this.array.Skip(2);

Assert.That(expected, Is.EqualTo(actual));
}

[Test]
public void SkipNullReferenceExceptionTest()
{
IEnumerable<int>? nullSequence = null;
Assert.Throws<NullReferenceException>(()
=> nullSequence!.Skip(1).ToList());
}

[Test]
public void SkipArgumentOutOfRangeExceptionTest()
{
Assert.Throws<ArgumentOutOfRangeException>(()
=> this.array.Skip(-1).ToList());
}

[Test]
public void TheUseOfTwoOperationsTest()
{
var expected = new[] { 2, 3, 4 };
var actual = this.array.Skip(1).Take(3).ToArray();

Assert.That(expected, Is.EqualTo(actual));
}
}
36 changes: 36 additions & 0 deletions homework_16_05_25/MyLinq/MyLinq.sln
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.13.35806.99
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyLinq", "MyLinq\MyLinq.csproj", "{ABCD93F0-8E7D-4728-B2E9-28DB81272A05}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyLinq.Tests", "MyLinq.Tests\MyLinq.Tests.csproj", "{655AE165-57E7-4DD7-B468-BEBA54CA5B94}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{36D591C7-65C7-A0D1-1CBC-10CDE441BDC8}"
ProjectSection(SolutionItems) = preProject
.editorconfig = .editorconfig
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{ABCD93F0-8E7D-4728-B2E9-28DB81272A05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ABCD93F0-8E7D-4728-B2E9-28DB81272A05}.Debug|Any CPU.Build.0 = Debug|Any CPU
{ABCD93F0-8E7D-4728-B2E9-28DB81272A05}.Release|Any CPU.ActiveCfg = Release|Any CPU
{ABCD93F0-8E7D-4728-B2E9-28DB81272A05}.Release|Any CPU.Build.0 = Release|Any CPU
{655AE165-57E7-4DD7-B468-BEBA54CA5B94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{655AE165-57E7-4DD7-B468-BEBA54CA5B94}.Debug|Any CPU.Build.0 = Debug|Any CPU
{655AE165-57E7-4DD7-B468-BEBA54CA5B94}.Release|Any CPU.ActiveCfg = Release|Any CPU
{655AE165-57E7-4DD7-B468-BEBA54CA5B94}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {4F1E7F5A-3054-454C-A329-6562C4D211C8}
EndGlobalSection
EndGlobal
18 changes: 18 additions & 0 deletions homework_16_05_25/MyLinq/MyLinq/MyLinq.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<NoWarn>SA0001</NoWarn>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="StyleCop.Analyzers" Version="1.2.0-beta.556">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>

</Project>
121 changes: 121 additions & 0 deletions homework_16_05_25/MyLinq/MyLinq/Sequences.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
// <copyright file="Sequences.cs" company="BengyaKirill">
// Copyright (c) BengyaKirill under MIT License. All rights reserved.
// </copyright>

namespace MyLinq;

/// <summary>
/// Class for slave with sequences.
/// </summary>
public static class Sequences
{
/// <summary>
/// Get a sequence of prime numbers.
/// </summary>
/// <returns>Sequence of prime numbers.</returns>
public static IEnumerable<int> GetPrimes()
{
int number = 2;
while (true)
{
if (IsPrime(number))
{
yield return number;
}

number++;
}

static bool IsPrime(int number)
{
int counter = 0;
for (var divider = 1; divider <= Math.Sqrt(number); divider++)
{
if (number % divider == 0)
{
counter++;
if (divider != number / divider)
{
counter++;
}
}

if (counter >= 3)
{
return false;
}
}

return counter == 2;
}
}

/// <summary>
/// Take a sequence of the first n elements of a sequence.
/// </summary>
/// <typeparam name="T">Parameter type of sequence elements.</typeparam>
/// <param name="seq">A sequence from which a
/// subsequence must be returned.</param>
/// <param name="n">The number of the element
/// to which you need to return.</param>
/// <returns>Subsequences of a sequence.</returns>
/// <exception cref="NullReferenceException">Zero sequence
/// transmitted.</exception>
/// <exception cref="ArgumentOutOfRangeException">Invalid parameter passed.</exception>
public static IEnumerable<T> Take<T>(this IEnumerable<T> seq, int n)
{
if (seq == null)
{
throw new NullReferenceException();
}

if (n < 0)
{
throw new ArgumentOutOfRangeException();
}

using var enumerator = seq.GetEnumerator();
for (var i = 0; i < n && enumerator.MoveNext(); i++)
{
yield return enumerator.Current;
}
}

/// <summary>
/// Get sequence without first n elements.
/// </summary>
/// <typeparam name="T">Parameter type of sequence elements.</typeparam>
/// <param name="seq">A sequence from which a
/// subsequence must be returned.</param>
/// <param name="n">The number of the element to skip to</param>
/// <returns>Subsequences of a sequence.</returns>
/// <exception cref="NullReferenceException">Zero sequence
/// transmitted.</exception>
/// <exception cref="ArgumentOutOfRangeException">
/// Invalid parameter passed.</exception>
public static IEnumerable<T> Skip<T>(this IEnumerable<T> seq, int n)
{
if (seq == null)
{
throw new NullReferenceException();
}

if (n < 0)
{
throw new ArgumentOutOfRangeException();
}

var counter = 0;
using var enumerator = seq.GetEnumerator();
while (enumerator.MoveNext())
{
if (counter < n)
{
counter++;
continue;
}

yield return enumerator.Current;
}
}
}
Loading