using System.Collections.Generic;
public struct IndexFrequency
static Dictionary<char, IndexFrequency> buildDictionary(string sentence)
Dictionary<char, IndexFrequency> dict = new Dictionary<char, IndexFrequency>();
string lower = sentence.ToLower();
for (int i=0; i<lower.Length; i++)
if (!dict.ContainsKey(myChar))
dict.Add(myChar, myStruct);
IndexFrequency myStruct = dict[myChar];
List<KeyValuePair<char, IndexFrequency>> list = dict.ToList();
static (char, int, int) repeatedCharacter(string input, Ordinality ordinality, Cardinality cardinality)
Dictionary<char, IndexFrequency> myDict = buildDictionary(input);
int myIndex = ordinality == Ordinality.First ? input.Length : -1;
int myFrequency = cardinality == Cardinality.MostFrequent ? 0 : 1000;
foreach (KeyValuePair<char, IndexFrequency> kvp in myDict)
if (cardinality == Cardinality.MostFrequent)
if (ordinality == Ordinality.First)
if (kvp.Value.frequency > myFrequency)
myIndex = kvp.Value.index;
myFrequency = kvp.Value.frequency;
if (kvp.Value.frequency >= myFrequency)
myIndex = kvp.Value.index;
myFrequency = kvp.Value.frequency;
if (ordinality == Ordinality.First)
if (kvp.Value.frequency < myFrequency)
myIndex = kvp.Value.index;
myFrequency = kvp.Value.frequency;
if (kvp.Value.frequency <= myFrequency)
myIndex = kvp.Value.index;
myFrequency = kvp.Value.frequency;
return (myChar, myIndex, myFrequency);
public static void Main()
string sentence = "ThisIsMySentence,ThereAreManyOthers,ButThisOneIsMine.";
(char myChar, int myIndex, int myFrequency) = repeatedCharacter(sentence, Ordinality.First, Cardinality.MostFrequent);
Console.WriteLine($"\nThe most frequent first character in this sentence: {sentence}\nis:{myChar} at index {myIndex} with frequency {myFrequency}");
(myChar, myIndex, myFrequency) = repeatedCharacter(sentence, Ordinality.Last, Cardinality.MostFrequent);
Console.WriteLine($"\nThe most frequent last character in this sentence: {sentence}\nis:{myChar} at index {myIndex} with frequency {myFrequency}");
(myChar, myIndex, myFrequency) = repeatedCharacter(sentence, Ordinality.First, Cardinality.LeastFrequent);
Console.WriteLine($"\nThe lest frequent first character in this sentence: {sentence}\nis:{myChar} at index {myIndex} with frequency {myFrequency}");
(myChar, myIndex, myFrequency) = repeatedCharacter(sentence, Ordinality.Last, Cardinality.LeastFrequent);
Console.WriteLine($"\nThe least frequent last character in this sentence: {sentence}\nis:{myChar} at index {myIndex} with frequency {myFrequency}");