Ha saját magunknak szeretnénk implementálni a halmazt, akkor többféle megközelÃtést is alkalmazhatunk.
Az alábbi példa egy nagyon egyszerű implementációt mutat be, ami egy tömbbe helyez el értékeket a hash érték alapján.
A .NET keretrendszer beépÃtett halmaz implementációja is hasonlóan működik, azzal a különbséggel, hogy a belsÅ‘leg az elemek tárolására használt tömb egy dinamikusan méret változtatásra képes listaszerűség.
using System;
using System.Collections;
using System.Collections.Generic;
namespace PeldaSajatAdatHalmaz
{
public class SajatHalmaz<T>: ICollection<T>
{
private T[] _array;
private int CalculateIndex(T item)
{
return Math.Abs(item.GetHashCode() % _array.Length);
}
public SajatHalmaz(int meret)
{
_array = new T[meret];
}
public int Count
{
get { return _array.Length; }
}
public bool IsReadOnly
{
get { return false; }
}
public void Add(T item)
{
int index = CalculateIndex(item);
_array[index] = item;
}
public void Clear()
{
for (int i=0; i<_array.Length; i++)
{
_array[i] = default(T);
}
}
public bool Contains(T item)
{
int index = CalculateIndex(item);
if (_array[index] == null)
{
return false;
}
else
{
return _array[index].Equals(item);
}
}
public void CopyTo(T[] array, int arrayIndex)
{
Array.Copy(_array, 0, array, arrayIndex, Count);
}
public bool Remove(T item)
{
int index = CalculateIndex(item);
_array[index] = default(T);
return true;
}
public IEnumerator<T> GetEnumerator()
{
for (int i = 0; i < Count; i++)
{
yield return _array[i];
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return _array.GetEnumerator();
}
}
}
A tesztelő program:
using System;
namespace PeldaSajatAdatHalmaz
{
class Program
{
static void Main(string[] args)
{
var halmaz = new SajatHalmaz<string>(3);
halmaz.Add("Hello");
halmaz.Add("World");
halmaz.Add("Pelda");
Console.WriteLine("A halmaz elemei:");
foreach (var item in halmaz)
{
Console.WriteLine(item);
}
Console.WriteLine();
bool tartalmazza = halmaz.Contains("Hello");
Console.WriteLine("Van benne Hello: {0}", tartalmazza);
tartalmazza = halmaz.Contains(":(");
Console.WriteLine("Van benne :( : {0}", tartalmazza);
Console.ReadKey();
}
}
}
A program kimenete
$
A halmaz elemei:
Pelda
World
Hello
Van benne Hello: True
Van benne :( : False