What’s new in Microsoft .NET 6 (Հայերեն)
By: Vanik Hakobyan
Tags: Csharp, Armenia, Dotnet, Microsoft, Json

2. System.Linq enhancements

Enumerable-ը այժմ support է անում Index և Range պարամետրներ։

Enumerable.Range(1, 10).ElementAt(^2); // returns 9

source.Take(..3) փոխարեն source.Take(3)

փոխարեն source.Take(3..) փոխարեն source.Skip(3)

փոխարեն source.Take(2..7) փոխարեն source.Take(7).Skip(2)

փոխարեն source.Take(^3..) փոխարեն source.TakeLast(3)

փոխարեն source.Take(..^3) փոխարեն source.SkipLast(3)

փոխարեն source.Take(^7..^3) փոխարեն source.TakeLast(7).SkipLast(3) .

DistinctBy/UnionBy/IntersectBy/ExceptBy

Ավելացվել է key selector function-ների միջոցով հավասարություն ստուգելու հնարավորություն։

Enumerable.Range(1, 20).DistinctBy(x => x % 3); // {1, 2, 3}



var first = new (string Name, int Age)[] { ("Francis", 20), ("Lindsey", 30), ("Ashley", 40) }; var second = new (string Name, int Age)[] { ("Claire", 30), ("Pat", 30), ("Drew", 33) }; first.UnionBy(second, person => person.Age); // { ("Francis", 20), ("Lindsey", 30), ("Ashley", 40), ("Drew", 33) }

MaxBy/MinBy

MaxBy և MinBy մեթոդները թույլ են տալիս գտնել մաքսիմում և մինիմում արժեքները օգտագործելով key selector-ներ։

var people = new (string Name, int Age)[] { ("Francis", 20), ("Lindsey", 30), ("Ashley", 40) };

people.MaxBy(person => person.Age); // ("Ashley", 40)

Chunk

Chunk-ը բաժանում է մասիվը ըստ նշված չափի։

IEnumerable<int[]> chunks = Enumerable.Range(0, 10).Chunk(size: 3); // { {0,1,2}, {3,4,5}, {6,7,8}, {9} }

3. Enhanced Date and Time support

Այս բաժնում ավելացել է 2 նոր տիպ (struct) DateOnly և TimeOnly: DateOnly struct-ը նախատեսված է միայն date-երի հետ աշխատելու համար, այլ կերպ ասած իր մեջ պարունակում է տարի, ամիս և օր։

DateOnly type

// Construction and properties

DateOnly d1 = new DateOnly(2021, 5, 31);

Console.WriteLine(d1.Year); // 2021

Console.WriteLine(d1.Month); // 5

Console.WriteLine(d1.Day); // 31

Console.WriteLine(d1.DayOfWeek); // Monday



// Manipulation

DateOnly d2 = d1.AddMonths(1); // You can add days, months, or years. Use negative values to subtract.

Console.WriteLine(d2); // "6/30/2021" notice no time



// You can use the DayNumber property to find out how many days are between two dates

int days = d2.DayNumber - d1.DayNumber;

Console.WriteLine($"There are {days} days between {d1} and {d2}");



// The usual parsing and string formatting tokens all work as expected

DateOnly d3 = DateOnly.ParseExact("31 Dec 1980", "dd MMM yyyy", CultureInfo.InvariantCulture); // Custom format

Console.WriteLine(d3.ToString("o", CultureInfo.InvariantCulture)); // "1980-12-31" (ISO 8601 format)



// You can combine with a TimeOnly to get a DateTime

DateTime dt = d3.ToDateTime(new TimeOnly(0, 0));

Console.WriteLine(dt); // "12/31/1980 12:00:00 AM"



// If you want the current date (in the local time zone)

DateOnly today = DateOnly.FromDateTime(DateTime.Today);

DateOnly տիպը համապատասխանում է SQL Server-ի date տիպին և կարող է ընդունել 0001–01–01-ից մինչև 9999–12–31 արժեք ինչպես DateTime-ը։

TimeOnly type

// Construction and properties

TimeOnly t1 = new TimeOnly(16, 30);

Console.WriteLine(t1.Hour); // 16

Console.WriteLine(t1.Minute); // 30

Console.WriteLine(t1.Second); // 0



// You can add hours, minutes, or a TimeSpan (using negative values to subtract).

TimeOnly t2 = t1.AddHours(10);

Console.WriteLine(t2); // "2:30 AM" notice no date, and we crossed midnight



// If desired, we can tell how many days were "wrapped" as the clock passed over midnight.

TimeOnly t3 = t2.AddMinutes(5000, out int wrappedDays);

Console.WriteLine($"{t3}, {wrappedDays} days later"); // "1:50 PM, 3 days later"



// You can subtract to find out how much time has elapsed between two times.

// Use "end time - start time". The order matters, as this is a circular clock. For example:

TimeOnly t4 = new TimeOnly(2, 0); // 2:00 (2:00 AM)

TimeOnly t5 = new TimeOnly(21, 0); // 21:00 (9:00 PM)

TimeSpan x = t5 - t4;

TimeSpan y = t4 - t5;

Console.WriteLine($"There are {x.TotalHours} hours between {t4} and {t5}"); // 19 hours

Console.WriteLine($"There are {y.TotalHours} hours between {t5} and {t4}"); // 5 hours



// The usual parsing and string formatting tokens all work as expected

TimeOnly t6 = TimeOnly.ParseExact("5:00 pm", "h:mm tt", CultureInfo.InvariantCulture); // Custom format

Console.WriteLine(t6.ToString("T", CultureInfo.InvariantCulture)); // "17:00:00" (long time format)



// You can get an equivalent TimeSpan for use with previous APIs

TimeSpan ts = t6.ToTimeSpan();

Console.WriteLine(ts); // "17:00:00"



// Or, you can combine with a DateOnly to get a DateTime

DateTime dt = new DateOnly(1970, 1, 1).ToDateTime(t6);

Console.WriteLine(dt); // "1/1/1970 5:00:00 PM"



// If you want the current time (in the local time zone)

TimeOnly now = TimeOnly.FromDateTime(DateTime.Now);



// You can easily tell if a time is between two other times

if (now.IsBetween(t1, t2))

Console.WriteLine($"{now} is between {t1} and {t2}.");

else

Console.WriteLine($"{now} is NOT between {t1} and {t2}.");

Այս տիպը իդեալական է երբ գործ ունենք օրվա ժամերի հետ, քանի որ TimeOnly-ն չի պարունակում ուրիշ ոչ մի ավելորդ ինֆորմացիա (օր, ամիս, տարի)։ TimeOnly ստրուկտուրան կարող է ընդունել 00:00:00.0000000-ից մինչև 23:59:59.9999999 արժեքներ։