using System.Collections.ObjectModel;
public class CustomKeyedCollection<TKey, TItem> : KeyedCollection<TKey, TItem>
private Func<TItem, TKey> keyForItemSelector;
public CustomKeyedCollection(Func<TItem, TKey> keySelector)
throw new ArgumentNullException(nameof(keySelector));
keyForItemSelector = keySelector;
protected override TKey GetKeyForItem(TItem item)
return keyForItemSelector(item);
public Citizen(string firstName, string lastName, string vatId)
public string FirstName { get; set; }
public string LastName { get; set; }
public string VatId { get; set; }
public override string ToString()
return String.Concat(FirstName, " ", LastName);
public static void Main()
var collection = new CustomKeyedCollection<string, Citizen>(c => c.VatId);
collection.Add(new Citizen("Anne", "Jensen", "9876543210"));
collection.Add(new Citizen("Roger", "Pierce", "0123456789"));
collection.Insert(0, new Citizen("Anne", "Jensen-Pierce", "0123443210"));
Console.WriteLine("== Select by VatId ===");
Console.WriteLine(collection["0123443210"]);
Console.WriteLine("== Print all =========");
foreach (var item in collection)