In my current work I need list with unique values -I need to keep insertion order on the list, interate through it, and to ensure it has only uniqe values.
Update: New version of ListUnique is here: http://it.tmod.pl/Blog/EntryId/201/ListUnique-generic-List-with-unique-values-in-Net-C-part-2.aspx
So, I've created ListUnique class with IListUnique interface, just by inheriting from List and overriding 2 methods.
Below is ListUnique class with IListUnique code, and unit test codes:
using System;
using System.Collections.Generic;
namespace TM.Utils.Collections
{
///
/// List that allows only unique values
///
/// Must implement IComparable
public class ListUnique : List, IListUnique where T : IComparable
{
public new void Add(T item)
{
if( Exists(itemList => itemList.CompareTo(item) == 0) )
{
throw new ArgumentException("Cannot add not unique value to collection");
}
base.Add(item);
}
public List ToList()
{
return this;
}
public ListUnique(IEnumerable collection)
{
foreach (T t in collection)
{
Add(t);
}
}
public ListUnique(int capacity): base(capacity)
{
}
public ListUnique()
{
}
}
///
/// IList that allows only unique values
///
/// Must implement IComparable
public interface IListUnique : IList where T : IComparable
{
List ToList();
}
}
using System;
using System.Collections.Generic;
using NUnit.Framework;
using TM.Utils.Collections;
namespace TM.Utils.Tests.Collections
{
[TestFixture]
public class ListUnique_Test
{
[Test]
public void CreateNew()
{
IListUnique listUnique = new ListUnique();
}
[Test]
public void AddUniqueValues()
{
IListUnique listUnique = new ListUnique();
listUnique.Add("a");
listUnique.Add("b");
listUnique.Add("c");
listUnique.Add("d");
Assert.AreEqual(4,listUnique.Count);
Assert.AreEqual("a",listUnique[0]);
Assert.AreEqual("d", listUnique[3]);
}
[Test]
public void CreateFromUniqueList()
{
List list=new List();
list.Add("a");
list.Add("b");
list.Add("c");
list.Add("d");
IListUnique listUnique = new ListUnique(list);
Assert.AreEqual(4, listUnique.Count);
Assert.AreEqual("a", listUnique[0]);
Assert.AreEqual("d", listUnique[3]);
}
[Test]
[ExpectedException(typeof(ArgumentException))]
public void AddNonUnique()
{
IListUnique listUnique = new ListUnique();
listUnique.Add("a");
listUnique.Add("b");
listUnique.Add("b");
listUnique.Add("d");
Assert.AreEqual(3, listUnique.Count);
Assert.AreEqual("a", listUnique[0]);
Assert.AreEqual("d", listUnique[2]);
}
[Test]
[ExpectedException(typeof(ArgumentException))]
public void CreateFromNotUniqueList()
{
List list = new List();
list.Add("a");
list.Add("b");
list.Add("b");
list.Add("d");
IListUnique listUnique = new ListUnique(list);
Assert.AreEqual(3, listUnique.Count);
Assert.AreEqual("a", listUnique[0]);
Assert.AreEqual("d", listUnique[2]);
}
}
}