fredag, oktober 16, 2009

SortedSet<T> i Visual Studio 2010

En grymt bra nyhet i Base Class Library (BCL) i .NET Framework 4.0 är SortedSet<T>. Den ligger i System.Collections.Generic och implementerar funktionalitet som jag många gånger har implementerat själv. Precis som HashSet<T> som var en nyhet i .NET 3.5 erbjudet SortSet möjligheten att skapa en collection som bara innehåller unika element. Skillnaden är att SortedSet också returnerar elementen sorterade.

Det innebär att om man matar in följande i en SortedSet<String>:


static void Main(string[] args)
{
var s = new SortedSet<string>();
s.Add("Hello");
s.Add("Visual Studio 2010");
s.Add("Is");
s.Add("So");
s.Add("Cool");
s.Add("Cool");
s.Add("Cool");


foreach (var word in s)
{
Console.WriteLine(word);
}
}

Så blir output:
Cool
Hello
Is
So
Visual Studio 2010

Algoritmen som ligger bakom sorteringen i collectionen är en self-balancing red-black tree och det har jag inte tänkt ge mig in på att förklara hur det funkar. Det finns det redan någon som gjort så bra ;-)

Add-metoden på både SortetSet och HashSet returnerar true eller false beroende på om det det element som skickades in adderades till collectionen eller inte.

En annan metod som är intressant är GetViewBetween(T lowerValue, T upperValue). Om man exekverar den på ett SortedSet så får man ett subset som innehåller alla element från det som är specificerat som lowerValue till upperValue. Det som är dock inte som man skulle kunna med tanke på namnet att den returnerar alla element som ligger mellan de två värdena utan den tar även med de värden man har angett.


var s = new SortedSet<int>();
s.Add(1);
s.Add(5);
s.Add(5);
s.Add(3);
s.Add(2);
s.Add(9);
s.Add(4);
s.Add(11);


var s2 = s.GetViewBetween(4, 9);

foreach (var number in s2)
{
Console.WriteLine(number);
}


Get då output:
4
5
9

Om man försöker lägga till ett element till s2 som är utanför gränsvärdena får man ett ArgumentOutOfRangeException.

Jag ser väldigt många användningsområden för SortedSet och ser väldigt mycket fram emot att få börja använda .NET 4.0!

1 kommentar:

Anonym sa...

Tak for de interessante oplysninger