static Dictionary <List <int>, string> CollapseGroups(Dictionary <int, string> strings, Dictionary <List <int>, string> groups) { var copyGroups = Extensions.DeepClone <List <KeyValuePair <List <int>, string> > >(groups.ToList()); var primaryWords = Extensions.GetSplittedWords(copyGroups[0].Value); for (int index = 1; index < copyGroups.Count; index++) { var secondaryWords = Extensions.GetSplittedWords(copyGroups[index].Value); switch (primaryWords.ContainsAllItems(secondaryWords)) { case 0: { copyGroups[0].Key.AddRange(copyGroups[index].Key); copyGroups.RemoveAt(index); break; } case 1: { copyGroups[0].Key.AddRange(copyGroups[index].Key); copyGroups.RemoveAt(index); break; } case 2: { break; } default: { var keys = new List <int>(copyGroups.ToDictionary(x => x.Key, x => x.Value).Keys.ToList()[index]); foreach (var item in keys) { var itemWords = Extensions.GetSplittedWords(strings.Values.ToArray()[item]); if (primaryWords.ContainsAllItems(itemWords) == 0 || primaryWords.ContainsAllItems(itemWords) == 1) { copyGroups[0].Key.Add(item); copyGroups[index].Key.Remove(item); var uniqueInCurrentGroup = Operands.GetUniqueInGroups(strings, new List <List <int> >() { copyGroups[index].Key }); KeyValuePair <List <int>, string> updatedItem = new KeyValuePair <List <int>, string>(copyGroups[index].Key, copyGroups[index].Value.Replace(copyGroups[index].Value, uniqueInCurrentGroup.Values.ToList()[0])); copyGroups[index] = updatedItem; } } break; } } } return(copyGroups.ToDictionary(x => x.Key, x => x.Value)); }
static int CountUnique(List <String> strings) { List <string> tempList = new List <string>(); foreach (var item in strings) { tempList.AddRange(Extensions.GetSplittedWords(item)); } return(Extensions.GetSplittedWords(String.Join(" ", tempList.ToArray())).Select(x => x).Distinct().Count()); }