۱۳۸۹/۰۲/۲۶

SortedSet در دات نت 4


SortedSet قرار گرفته در فضاي نام System.Collections.Generic دات نت 4، ليستي از اشياء به صورت خودكار مرتب شده را ارائه مي‌دهد. SortedSet نيز همانند HashSet از اعضاي منحصربفردي تشكيل خواهد شد اما اينبار به شكلي مرتب شده. براي پياده سازي آن از red-black tree data structure استفاده شده است كه مهم‌ترين مزيت آن امكان افزودن و يا حذف اشياء به آن بدون كاهش قابل توجه كارآيي برنامه است.

مثال اول:
using System;
using System.Collections.Generic;

namespace SortedSetTest
{
class Program
{
static void sample1()
{
var setRange = new SortedSet<int> { 2, 5, 6, 2, 1, 4, 8 };

foreach (var i in setRange)
{
Console.WriteLine(i);
}
}

static void Main()
{
sample1();
}
}
}
در اين مثال با نحوه‌ي ايجاد اين ليست جنريك خود مرتب شونده‌ي تكراري نپذير (!) آشنا مي‌شويد. اگر اين مثال را اجرا نمائيد، خروجي آن مرتب شده است و همچنين تنها شامل يك عدد 2 است (اعضاي تكراري را حذف مي‌كند).

مثال دوم:

using System;
using System.Collections.Generic;

namespace SortedSetTest
{
class Program
{
static void sample2()
{
var setRange = new SortedSet<int>();
var random = new Random();

for (int counter = 0; counter < 100; counter++)
{
var rnd = random.Next(-180, 181);
if (!setRange.Add(rnd))
{
Console.WriteLine("Couldn't add {0}", rnd);
}
}

Console.WriteLine("Result set:");
foreach (var item in setRange)
{
Console.WriteLine(item);
}
}

static void Main()
{
sample2();
}
}
}
در اين مثال نحوه‌ي افزودن اعضاي مختلف به اين ليست ويژه، توسط متد Add آن بيان شده است. اگر آيتمي در اين ليست موجود باشد، مجددا اضافه نشده و حاصل متد Add آن، False خواهد بود.

مثال سوم:
اگر از ساير انواع سفارشي تعريف شده استفاده نمائيد، بايد روش مقايسه‌ي آن‌ها را نيز با پياده سازي اينترفيس استاندارد IComparable ارائه دهيد؛ در غير اينصورت با خطاي At least one object must implement IComparable متوقف خواهيد شد.

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

namespace SortedSetTest
{
class FileInfo
{
public string Name { set; get; }
public long Size { set; get; }
}

class FileInfoComparer : IComparer<FileInfo>
{
public int Compare(FileInfo x, FileInfo y)
{
var caseiComp = new CaseInsensitiveComparer();
return caseiComp.Compare(x.Name, y.Name);
}
}


class Program
{

static void sample3()
{
var setRange = new SortedSet<FileInfo>(new FileInfoComparer())
{
new FileInfo
{
Name = "file1.txt",
Size = 100
},
new FileInfo
{
Name = "file2.txt",
Size = 10
},
new FileInfo
{
Name = "file3.txt",
Size = 300
}
};

foreach (var item in setRange)
{
Console.WriteLine(item.Name);
}
}

static void Main()
{
sample3();

Console.WriteLine("Press a key...");
Console.ReadKey();
}
}
}

در اين مثال اشيايي از نوع كلاس FileInfo به ليست ويژه‌ي ما اضافه شده‌اند. براي اينكه امكان مقايسه‌ي آن‌ها فراهم باشد ، كلاس FileInfoComparer با پياده سازي اينترفيس IComparer ، روش مقايسه دو شيء از اين دست را ارائه مي‌دهد.