static public string[][] LeftJoin(HashTable synonyms, HashTable antonyms)
        {
            List <string[]> result = new List <string[]>();

            foreach (var b in synonyms.Buckets)
            {
                if (b != null)
                {
                    LinkedListNode <string[]> current = b.First;
                    while (current != null)
                    {
                        result.Add(new string[] { current.Value[0], current.Value[1], "NULL" });
                        current = current.Next;
                    }
                }
            }
            foreach (var k in result)
            {
                if (antonyms.Contains(k[0]))
                {
                    k[2] = antonyms.Get(k[0]);
                }
            }
            return(result.ToArray());
        }
        public static List <string[]> LeftJoin(HashTable hashTableA, HashTable hashTableB)
        {
            List <string[]> results = new List <string[]>();

            foreach (var bucket in hashTableA.Contents)
            {
                if (bucket != null)
                {
                    foreach (var kvPair in bucket)
                    {
                        string[] result = new string[] { kvPair.Key, kvPair.Value, null };
                        results.Add(result);
                        if (hashTableB.Contains(kvPair.Key))
                        {
                            result[2] = hashTableB.Get(kvPair.Key);
                        }
                    }
                }
            }
            return(results);
        }
        /// <summary>
        /// Left joins two HashTable<string> objects.
        /// </summary>
        /// <param name="leftTable">
        /// HashTable<string>: the HashTable<string> to be used as the left table in the left join
        /// </param>
        /// <param name="rightTable">
        /// HashTable<string>: the HashTable<string> to be used as the right table in the left join
        /// </param>
        /// <returns>
        /// HashTable<string>: a HashTable<LeftJoinNode>, containing the keys and values from leftTable and rightTable, left joined together
        /// </returns>
        public static HashTable <LeftJoinNode> LeftJoinHashTables(HashTable <string> leftTable, HashTable <string> rightTable)
        {
            HashTable <LeftJoinNode> leftJoin = new HashTable <LeftJoinNode>();

            for (int i = 0; i < leftTable.HashMap.Length; i++)
            {
                if (leftTable.HashMap[i] != null)
                {
                    var currNode = leftTable.HashMap[i].First;
                    while (currNode != null)
                    {
                        LeftJoinNode newLeftJoinNode = new LeftJoinNode(currNode.Value.Value);
                        if (rightTable.Contains(currNode.Value.Key))
                        {
                            newLeftJoinNode.RightValue = rightTable.Get(currNode.Value.Key);
                        }
                        leftJoin.Add(currNode.Value.Key, newLeftJoinNode);
                        currNode = currNode.Next;
                    }
                }
            }
            return(leftJoin);
        }