سالهاست که دات نت با استفاده از Linq برنامهنویسی را سادهتر کرده است. در اینجا به چند ترفند که ممکن است تاکنون استفاده نکرده باشید میپردازیم. البته قرار نیست به مکانیزم و جزئیات بپردازیم. بیشتر به عنوان یادآوری و یا یک استفاده «جالب» به آن نگاه کنید.
فرض کنید می خواهید یک آرایه ده عضوی از نوع int با مقدار اولیه 5 بسازید. در حالت سنتی شما ابتدا آرایه را به طول مورد نظر می سازید و بعد یک حلقه برای مقدار دهی اولیه در نظر می گیرید. ولی با linq به سادگی زیر است:
int[] array = Enumerable.Repeat(0, 10).Select(x => 5).ToArray();
حتی اگر بخواهید یک ارایه از یک نمونه کلاس بسازید هم کافیست به جای 5 عبارت new MyClass() استفاده شود. با کمی تغییر می توانید بسیاری از مقداردهیهای اولیه مدنظر را پیاده سازی کنید.
مثلا اگر بخواهید یک مجموعه ده عضوی از اعداد تصادفی بین 0 تا 100 ایجاد کنید داریم:
Random rnd = new Random(); int[] array = Enumerable.Repeat(0, 10).Select(x => rnd.Next(0, 100)).ToArray();
دقت کنید که در این مجموعه ممکن است عدد تکراری داشته باشید.
یا برای ایجاد یک رشته تصادفی از کاراکترهای مورد نظر داریم:
Random rnd = new Random(); char[] characters = "0123456789ABCDEF".ToCharArray(); var str = string.Join(null, Enumerable.Repeat(0, 10).Select(x => characters[rnd.Next(0, characters.Length)]).ToArray());
فرض کنید می خواهید یک ارایه ده عضوی از اعداد 0 تا 9 به صورت تصادفی داشته باشد. به عبارت دیگر هر یک از اعداد مذکور فقط یک بار تکرار شده باشد.
Random rnd = new Random(); var randomSeq = Enumerable.Range(0, 10) .Select(i => new { rnd = rnd.Next(), data = i }) .OrderBy(x => x.rnd) .Select(x => x.data) .ToArray();
همچنین اگر بخواهید یک آرایه مثلا سه عضوی از اعداد تصادفی بین 0 تا 9 بدون تکرار داشته باشید، کافیست از take(3) استفاده کنید یعنی:
Random rnd = new Random(); var randomSeq = Enumerable.Range(0, 10) .Select(i => new { rnd = rnd.Next(), data = i }) .OrderBy(x => x.rnd) .Select(x => x.data) .Take(3) .ToArray();
کد زیر نیز تمام زیر مجموعههای آرایهی arr را برای شما استخراج می کند:
char[] arr = { 'A', 'B', 'C', 'D' }; IEnumerable<IEnumerable<char>> subsets = from item in Enumerable.Range(0, 1 << arr.Length) select from i in Enumerable.Range(0, arr.Length) where (item & (1 << i)) != 0 select arr[i];
که خروجی چیزی شبیه این است:
A
B
AB
C
AC
BC
ABC
D
AD
BD
ABD
CD
ACD
BCD
ABCD