محمد خوش کشت
محمد خوش کشت
خواندن ۴ دقیقه·۳ سال پیش

Top 10 New .NET 6.0 API

در .NET 6 API های جدید را برای توسعه ساده تر و سریعتر معرفی کرده که به توضیح آنها میپردازیم:

Top 10 New .NET 6.0 - Recompile.ir
Top 10 New .NET 6.0 - Recompile.ir


1- تا به حال دو کلاس DateTime , TimeSpan برای هندل کردن عملیات تاریخ وجود داشت اما د ر.NET 6 دو تابع DateOnly , TimeOnly برای کار راحت تر با تاریخ و زمان اضافه شده است

var dateOnly = new DateOnly(2021,7,7); Assert.IsTrue(dateOnly.ToString() == &quot07-Jul-21&quot); Assert.IsTrue(dateOnly.AddMonths(1).ToString() == &quot07-Aug-21&quot); var timeOnly = new TimeOnly(11, 43, 57); Assert.IsTrue(timeOnly.ToString() == &quot11:43 AM&quot); Assert.IsTrue(timeOnly.AddHours(1) > timeOnly); Assert.IsTrue(timeOnly.AddHours(1) - timeOnly == new TimeSpan(1,0,0)); DateTime dateTime = dateOnly.ToDateTime(timeOnly); Assert.IsTrue(dateTime.ToString() == &quot07-Jul-21 11:43:57 AM&quot); Assert.IsTrue(DateOnly.FromDateTime(dateTime) == dateOnly); Assert.IsTrue(TimeOnly.FromDateTime(dateTime) == timeOnly);

2- برای پرفورمنس بالاتر صف اولویت دار PriorityQueue اضافه شده است که در آن اولویت آیتمها قبل تغییر نیست (سریعتر پیمایش می شود) و پیاده سازی آن هم الزاما پایدار نمی باشد. صف اولویت دار زمانی پایدار است که آیتمها به همان ترتیب برداشته شدن وارد صف شوند

var youngerFirstQueue = new PriorityQueue<string, int>(); youngerFirstQueue.Enqueue(&quotLena&quot, 7); youngerFirstQueue.Enqueue(&quotPatrick&quot, 46); youngerFirstQueue.Enqueue(&quotPaul&quot, 7); Assert.IsTrue(youngerFirstQueue.Dequeue() == &quotLena&quot); Assert.IsTrue(youngerFirstQueue.Dequeue() == &quotPaul&quot); Assert.IsTrue(youngerFirstQueue.Dequeue() == &quotPatrick&quot);

3- Index و Range در LINQ قابل استفاده شده اند.Index , Range از قابلیتهای C#8 هستند. توضیح

// 6 element indexed from 0 to 5 var arr = new [] {0, 1, 2, 3, 4, 5}; Assert.IsTrue(arr.ElementAt(^2) == 4); // Take the second element from the end Assert.IsTrue(arr.ElementAtOrDefault(^10) == default); // No such index Assert.IsTrue(arr.Take(2..4).SequenceEqual(new[] { 2, 3 })); Assert.IsTrue(arr.Take(2..^2).SequenceEqual(new[] { 2, 3 })); // New Index Range usage with their pre .NET 6 equivalent Assert.IsTrue(arr.Take(..2).SequenceEqual(new[] { 0, 1 })); Assert.IsTrue(arr.Take(2).SequenceEqual(new[] { 0, 1 })); Assert.IsTrue(arr.Take(2..).SequenceEqual(new[] { 2, 3, 4, 5 })); Assert.IsTrue(arr.Skip(2).SequenceEqual(new[] { 2, 3, 4, 5 })); Assert.IsTrue(arr.Take(^2..).SequenceEqual(new[] { 4, 5 })); Assert.IsTrue(arr.TakeLast(2).SequenceEqual(new[] { 4, 5 })); Assert.IsTrue(arr.Take(..^2).SequenceEqual(new[] { 0, 1, 2, 3 })); Assert.IsTrue(arr.SkipLast(2).SequenceEqual(new[] { 0, 1, 2, 3 }));

4- برای FirstOrDefault(), LastOrDefault() SingleOrDefault() میتوانید مقدار پیش فرض تعیین کنید

var arr = new [] {0, 1, 2, 3, 4, 5}; Assert.IsTrue(arr.FirstOrDefault(x => x > 6) == 0); Assert.IsTrue(arr.FirstOrDefault(x => x > 6, -1) == -1);

5- قابلیتهای MaxBy(), MinBy(), DistinctBy(), UnionBy(), IntersectBy(), ExceptBy() اضافه شد اند

var buckets1 = new[] { (Color: &quotRed&quot, Price: 7), (Color: &quotBlue&quot, Price: 10), (Color: &quotGreen&quot, Price: 7), }; var buckets2 = new[] { (Color: &quotWhite&quot, Price: 7), (Color: &quotBlack&quot, Price: 12), }; Assert.IsTrue(buckets1.MaxBy(p => p.Price).Color == &quotBlue&quot); Assert.IsTrue(buckets1.MinBy(p => p.Price).Color == &quotRed&quot); // bucket from buckets1 distinct by price Assert.IsTrue(buckets1.DistinctBy(p => p.Price) .Select(p => p.Color).SequenceEqual(new [] {&quotRed&quot, &quotBlue&quot })); // Union from buckets1 and buckets2 distinct by price Assert.IsTrue(buckets1.UnionBy(buckets2, p => p.Price) .Select(p => p.Color).SequenceEqual(new[] { &quotRed&quot, &quotBlue&quot, &quotBlack&quot })); // Unique bucket from buckets1 with a price in buckets2 Assert.IsTrue(buckets1.IntersectBy(buckets2.Select(p => p.Price), p => p.Price) .Select(p => p.Color).SequenceEqual(new[] { &quotRed&quot })); // Unique bucket from buckets1 with a price Not in buckets2 Assert.IsTrue(buckets1.ExceptBy(buckets2.Select(p => p.Price), p => p.Price) .Select(p => p.Color).SequenceEqual(new[] { &quotBlue&quot}));

6- چون ممکن است پیدا کردن تعداد پروفورمنس را تحت تاثیر بگذارد تابع TryGetNonEnumeratedCount برای تست کردن گرفتن تعداد طراحی شده که true, false می دهد

class MyCollection<T> : IEnumerable<T> { public IEnumerator<T> GetEnumerator() { throw new NotImplementedException(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } ... IEnumerable<int> seq1 = new[] { 0, 1, 2, 3, 4, 5 }; Assert.IsTrue(seq1.TryGetNonEnumeratedCount(out int count1)); Assert.IsTrue(count1 == 6); IEnumerable<int> seq2 = new MyCollection<int>(); Assert.IsFalse(seq2.TryGetNonEnumeratedCount(out int count2));

7- اضافه شدن IEnumerable Chunk و IQueryable Chunk و برای راحت تر کردن عملیات chunk کردن و خواندن توالی

var arr = new[] { 0, 1, 2, 3, 4, 5, 6 }; IEnumerable<int[]> chuncks = arr.Chunk(3); Assert.IsTrue(chuncks.ElementAt(0).SequenceEqual(new[] { 0, 1, 2 })); Assert.IsTrue(chuncks.ElementAt(1).SequenceEqual(new[] { 3, 4, 5 })); Assert.IsTrue(chuncks.ElementAt(2).SequenceEqual(new[] { 6 }));

8- تا به حال می شد تا 2 توالی را Zip کنیم اما حالا امکان Zip کردن سه توالی اضافه شده است.

var integers = Enumerable.Range(0, 4); var squares = integers.Select(i => i * i); var cubes = integers.Select(i => i * i * i); var zip = integers.Zip(squares, cubes).ToArray(); foreach ((int i, int square, int cube) in zip) { Assert.IsTrue($&quot{i} {square} {cube}&quot == $&quot{i} {i * i} {i * i * i}&quot); }

9- اضافه شدن EnsureCapacity() به List, Stack, Queue . باتوجه به اینکه همه این کالکشن ها یک ظرفیت داخلی دارند و با اضافه شدن به لیست آنها ظرفیت افزایش پیدا می کند و این کار می تواند در پرفورمنس موثر باشد، شما می توانید ظرفیت لازم را برای هر کدام تعیین کنید.

var list = new List<int> {1, 2}; Assert.IsTrue(list.Capacity < 100); list.EnsureCapacity(100); Assert.IsTrue(list.Count == 2); Assert.IsTrue(list.Capacity == 100); list.EnsureCapacity(50); Assert.IsTrue(list.Capacity == 100); for(int i = list.Count; i < 100; i++) { list.Add(i); } Assert.IsTrue(list.Count == 100); Assert.IsTrue(list.Capacity == 100);

10- اضافه شدن متد جدید Task.WaitAsync() .اگر timeout رخ بدهد هم تسک و هم wait کنسل می شوند

public Task Task.WaitAsync(CancellationToken cancellationToken); public Task Task.WaitAsync(TimeSpan timeout); public Task Task.WaitAsync(TimeSpan timeout, CancellationToken cancellationToken)

ترجمه: http://recompile.ir/learning/top-10-new-net-6-0-api/

منبع : https://blog.ndepend.com/top-10-new-net-6-0-api

developcnetnet6برنامه نویسی
طراح و توسعه دهنده نرم افزار، با سوابق مختلف در زمینه زیر ساخت و SQL Server
شاید از این پست‌ها خوشتان بیاید