هنگامی که حجم دادهها کم باشد شاید روش دسترسی و الگوریتم مورد استفاده اهمیتی نداشته باشد اما با افزایش حجم دادهها روشهای بهینهتر تاثیر مستقیم در کارایی برنامه دارند.
در این مثال سعی بر این است که در یک سناریوی خاص تفاوت بین Dictionary و List را بررسی کنیم :
فرض کنید 2 کلاس Student و Grade موجود است که وظیفهی نگهداری اطلاعات دانش آموز و نمره را بر عهده دارند.
public class Grade { public Guid StudentId { get; set; } public string Value { get; set; } public static IEnumerable<Grade> GetData() { for (int i = 0; i < 10000; i++) { yield return new Grade { StudentId = GuidHelper.ListOfIds[i], Value = "Value " + i }; } } } public class Student { public Guid Id { get; set; } public string Name { get; set; } public string Grade { get; set; } public static IEnumerable<Student> GetStudents() { for (int i = 0; i < 10000; i++) { yield return new Student { Id = GuidHelper.ListOfIds[i], Name = "Name " + i }; } } }
public class GuidHelper { public static List<Guid> ListOfIds=new List<Guid>(); static GuidHelper() { for (int i = 0; i < 10000; i++) { ListOfIds.Add(Guid.NewGuid()); } } }
ابتدا از LINQ روی لیست برای پیدا کردن نمرهی مورد نظر استفاده کرده و در روش دوم برای پیدا کردن نمرهی هر دانش آموز از Dictionary استفاده شده :
internal class Program { private static void Main(string[] args) { var stopwatch = new Stopwatch(); List<Grade> grades = Grade.GetData().ToList(); List<Student> students = Student.GetStudents().ToList(); stopwatch.Start(); foreach (Student student in students) { student.Grade = grades.Single(x => x.StudentId == student.Id).Value; } stopwatch.Stop(); Console.WriteLine("Using list {0}", stopwatch.Elapsed); stopwatch.Reset(); students = Student.GetStudents().ToList(); stopwatch.Start(); Dictionary<Guid, string> dictionary = Grade.GetData().ToDictionary(x => x.StudentId, x => x.Value); foreach (Student student in students) { student.Grade = dictionary[student.Id]; } stopwatch.Stop(); Console.WriteLine("Using dictionary {0}", stopwatch.Elapsed); Console.ReadKey(); } }
همانگونه که مشاهده میشود در این سناریو خواندن نمره از روی Dictionary بر اساس 'کلید' بسیار سریعتر از انجام یک پرس و جوی LINQ روی لیست است.
زمانی که از LINQ on list
student.Grade = grades.Single(x => x.StudentId == student.Id).Value;
زمانی که از Dictonary
student.Grade = dictionary[student.Id];
در نتیجه اگر نیاز به پیدا کردن اطلاعات بر اساس یک مقدار یکتا یا کلید باشد تبدیل اطلاعات به Dictionary و خواندن از آن بسیار به صرفهتر است.
تفاوت این 2 روش وقتی مشخص میشود که میزان دادهها زیاد باشد.
در همین رابطه (1 ، 2)
DictionaryVsList.zip