۱۳۸۸/۰۸/۰۴

استفاده از LINQ جهت تهيه كدهايي كوتاه‌تر و خواناتر


با كمك امكانات ارائه شده توسط LINQ ، مي‌توان بسياري از اعمال برنامه نويسي را در حجمي كمتر، خواناتر و در نتيجه با قابليت نگهداري بهتر، انجام داد كه تعدادي از آن‌ها را در ادامه مرور خواهيم كرد.

الف) تهيه يك يك رشته، حاوي عناصر يك آرايه، جدا شده با كاما.

using System.Linq;

public class CLinq
{
public static string GetCommaSeparatedListNormal(string[] data)
{
string items = string.Empty;

foreach (var item in data)
{
items += item + ", ";
}

return items.Remove(items.Length - 2, 1).Trim();
}

public static string GetCommaSeparatedList(string[] data)
{
return data.Aggregate((s1, s2) => s1 + ", " + s2);
}
}
همانطور كه ملاحظه مي‌كنيد در روش دوم با استفاده از LINQ Aggregate extension method ، كد جمع و جورتر و خواناتري نسبت به روش اول حاصل شده است.

ب) پيدا كردن تعداد عناصر يك آرايه حاوي مقداري مشخص
براي مثال آرايه زير را در نظر بگيريد:

var names = new[] { "name1", "name2", "name3", "name4", "name5", "name6", "name7" };
قصد داريم تعداد عناصر حاوي name را مشخص سازيم.
در تابع GetCountNormal زير، اين كار به شكلي متداول انجام شده و در GetCount از LINQ Count extension method كمك گرفته شده است.

using System.Linq;

public class CLinq
{
public static int GetCountNormal()
{
var names = new[] { "name1", "name2", "name3", "name4", "name5", "name6", "name7" };
var count = 0;
foreach (var name in names)
{
if (name.Contains("name"))
count += 1;
}
return count;
}

public static int GetCount()
{
var names = new[] { "name1", "name2", "name3", "name4", "name5", "name6", "name7" };
return names.Count(name => name.Contains("name"));
}
}
به نظر شما كدام روش خواناتر بوده و نگهداري و يا تغيير آن در آينده ساده‌تر مي‌باشد؟

ج) دريافت ليستي از عناصر شروع شده با يك عبارت
در اينجا نيز دو روش متداول و استفاده از LINQ بررسي شده است.

using System.Linq;
using System.Collections.Generic;

public class CLinq
{
public static List<string> GetListNormal()
{
List<string> sampleList = new List<string>() { "A1", "A2", "P1", "P10", "B1", "B@", "J30", "P12" };
List<string> result = new List<string>();
foreach (var item in sampleList)
{
if (item.StartsWith("P"))
result.Add(item);
}
return result;
}

public static List<string> GetList()
{
List<string> sampleList = new List<string>() { "A1", "A2", "P1", "P10", "B1", "B@", "J30", "P12" };
return sampleList.Where(x => x.StartsWith("P")).ToList();
}
}

و در حالت كلي، اكثر حلقه‌هاي foreach متداول را مي‌توان با نمونه‌هاي خواناتر كوئري‌هاي LINQ معادل، جايگزين كرد.

Vote on iDevCenter