public static void Main()
    {
        var bdict = new BiDictionary<string, int, Person>();

        var people = new[]
        {
            new Person() { Name = "Peter", Age = 20, Town = "Sofia" },
            new Person() { Name = "Peter", Age = 20, Town = "Varna" },
            new Person() { Name = "Peter", Age = 25, Town = "Varna" },
            new Person() { Name = "Billy", Age = 20, Town = "Sofia" },
        };

        // Add people to dictionary
        foreach (var person in people)
        {
            // key1 (name), key2 (age), value (person)
            bdict.Add(person.Name, person.Age, person);
        }

        // Print all people from dictionary
        Console.WriteLine("All people in the BiDictionary:");
        foreach (var triple in bdict)
        {
            Console.WriteLine(string.Join(Environment.NewLine, triple.Item3));
        }

        // Test the dictionary by searching by key1 (name), key2 (age) and both key1 and key2
        Console.WriteLine("All people named Peter: {0}", string.Join(", ", bdict.GetByK1("Peter")));
        Console.WriteLine("All people at age 20: {0}", string.Join(", ", bdict.GetByK2(20)));
        Console.WriteLine("All people at age 20, named Peter: {0}", string.Join(", ", bdict.GetByBoth("Peter", 20)));
    }