Here's the scenario: I have a dictionary of words / suggested terms. I am trying to create a list of new values combining the suggested terms for each word. The number of keys can be variable (usually 1-3 words):
var suggestions = new Dictionary<string, List<SuggestItem>>();
where SuggestItem contains a property of public string Term {get;set;}
The way the algorithm works is given a sentance, the words are split apart, each word is check and expanded if an abbreviation, and then passed through a spell checker, which returns a list of suggestions. These results are stored in the dictionary with the original word as the key. This part all works fine. What I am needing help with is turning the dictionary into a list of suggestions with every possible combination of suggested terms.
Example:
Given a sentence:
"e cleve"
Generates a dictionary:
Keys: Values:
east east
eastlake
cleve cleves
college
cleveland
coolville
cloverdale
cedarville
celeryville
circleville
conesville
centerville
clairsville
clarksville
chesterville
cridersville
What I need returned is:
Terms
east cleves
east college
east cleveland
east coolville
east cloverdale
east cedarville
east celeryville
east circleville
east conesville
east centerville
east clairsville
east clarksville
east chesterville
east cridersville
eastlake cleves
eastlake college
eastlake cleveland
eastlake coolville
eastlake cloverdale
eastlake cedarville
eastlake celeryville
eastlake circleville
eastlake conesville
eastlake centerville
eastlake clairsville
eastlake clarksville
eastlake chesterville
eastlake cridersville
as a List<string>()
Note: I can hard code this for 2 keys, however there is a need for a variable number of keys.
Note 2: I apologize for the ambiguity with my expected results. I hope my edit clarifies this.
If there were 3 words in the sentence: "e cleve commons", it would have 3 keys in the suggestions dictionary:
Keys: Values:
east east
eastlake
cleve cleves
college
cleveland
coolville
cloverdale
cedarville
celeryville
circleville
conesville
centerville
clairsville
clarksville
chesterville
cridersville
commons collins
corners
congress
columbus
conesville
crooksville
and a results list as:
Terms
east cleves collins
east college collins
east cleveland collins
east coolville collins
east cloverdale collins
east cedarville collins
east celeryville collins
east circleville collins
east conesville collins
east centerville collins
east clairsville collins
east clarksville collins
east chesterville collins
east cridersville collins
eastlake cleves collins
eastlake college collins
eastlake cleveland collins
eastlake coolville collins
eastlake cloverdale collins
eastlake cedarville collins
eastlake celeryville collins
eastlake circleville collins
eastlake conesville collins
eastlake centerville collins
eastlake clairsville collins
eastlake clarksville collins
eastlake chesterville collins
eastlake cridersville collins
east cleves collins
east college collins
east cleveland collins
east coolville collins
east cloverdale collins
east cedarville collins
east celeryville collins
east circleville collins
east conesville collins
east centerville collins
east clairsville collins
east clarksville collins
east chesterville collins
east cridersville collins
eastlake cleves collins
eastlake college collins
eastlake cleveland collins
eastlake coolville collins
eastlake cloverdale collins
eastlake cedarville collins
eastlake celeryville collins
eastlake circleville collins
eastlake conesville collins
eastlake centerville collins
eastlake clairsville collins
eastlake clarksville collins
eastlake chesterville collins
eastlake cridersville collins
east cleves corners
east college corners
east cleveland corners
east coolville corners
east cloverdale corners
east cedarville corners
east celeryville corners
east circleville corners
east conesville corners
east centerville corners
east clairsville corners
east clarksville corners
east chesterville corners
east cridersville corners
eastlake cleves corners
eastlake college corners
eastlake cleveland corners
eastlake coolville corners
eastlake cloverdale corners
eastlake cedarville corners
eastlake celeryville corners
eastlake circleville corners
eastlake conesville corners
eastlake centerville corners
eastlake clairsville corners
eastlake clarksville corners
eastlake chesterville corners
eastlake cridersville corners
east cleves congress
east college congress
east cleveland congress
east coolville congress
east cloverdale congress
east cedarville congress
east celeryville congress
east circleville congress
east conesville congress
east centerville congress
east clairsville congress
east clarksville congress
east chesterville congress
east cridersville congress
eastlake cleves congress
eastlake college congress
eastlake cleveland congress
eastlake coolville congress
eastlake cloverdale congress
eastlake cedarville congress
eastlake celeryville congress
eastlake circleville congress
eastlake conesville congress
eastlake centerville congress
eastlake clairsville congress
eastlake clarksville congress
eastlake chesterville congress
eastlake cridersville congress
east cleves columbus
east college columbus
east cleveland columbus
east coolville columbus
east cloverdale columbus
east cedarville columbus
east celeryville columbus
east circleville columbus
east conesville columbus
east centerville columbus
east clairsville columbus
east clarksville columbus
east chesterville columbus
east cridersville columbus
eastlake cleves columbus
eastlake college columbus
eastlake cleveland columbus
eastlake coolville columbus
eastlake cloverdale columbus
eastlake cedarville columbus
eastlake celeryville columbus
eastlake circleville columbus
eastlake conesville columbus
eastlake centerville columbus
eastlake clairsville columbus
eastlake clarksville columbus
eastlake chesterville columbus
eastlake cridersville columbus
east cleves conesville
east college conesville
east cleveland conesville
east coolville conesville
east cloverdale conesville
east cedarville conesville
east celeryville conesville
east circleville conesville
east conesville conesville
east centerville conesville
east clairsville conesville
east clarksville conesville
east chesterville conesville
east cridersville conesville
eastlake cleves conesville
eastlake college conesville
eastlake cleveland conesville
eastlake coolville conesville
eastlake cloverdale conesville
eastlake cedarville conesville
eastlake celeryville conesville
eastlake circleville conesville
eastlake conesville conesville
eastlake centerville conesville
eastlake clairsville conesville
eastlake clarksville conesville
eastlake chesterville conesville
eastlake cridersville conesville
east cleves crooksville
east college crooksville
east cleveland crooksville
east coolville crooksville
east cloverdale crooksville
east cedarville crooksville
east celeryville crooksville
east circleville crooksville
east conesville crooksville
east centerville crooksville
east clairsville crooksville
east clarksville crooksville
east chesterville crooksville
east cridersville crooksville
eastlake cleves crooksville
eastlake college crooksville
eastlake cleveland crooksville
eastlake coolville crooksville
eastlake cloverdale crooksville
eastlake cedarville crooksville
eastlake celeryville crooksville
eastlake circleville crooksville
eastlake conesville crooksville
eastlake centerville crooksville
eastlake clairsville crooksville
eastlake clarksville crooksville
eastlake chesterville crooksville
eastlake cridersville crooksville
Thank you in advance.
You can use the cartesian product by Eric Lippert
var result = CartesianProduct(dict.Values.Select(x => x.Term))
.Select(x => String.Join(" ", x))
.ToList();
static IEnumerable<IEnumerable<T>> CartesianProduct<T>(IEnumerable<IEnumerable<T>> sequences)
{
// base case:
IEnumerable<IEnumerable<T>> result = new[] { Enumerable.Empty<T>() };
foreach (var sequence in sequences)
{
var s = sequence; // don't close over the loop variable
// recursive case: use SelectMany to build the new product out of the old one
result =
from seq in result
from item in s
select seq.Concat(new[] { item });
}
return result;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With