PC Review


Reply
Thread Tools Rate Thread

Create Permutations from Dictionary<string, List<string>>

 
 
Assimalyst
Guest
Posts: n/a
 
      30th Nov 2007
Hi

I have a Dictionary<string, List<string>>, which i have successfully
filled. My problem is I need to create a filter expression using all
possible permutations of its contents.

i.e. the dictionary essentially creates the following array:

Key Value

Column1 1
Column1 2
Column2 17

I want to then create an number of filter expressions:

Column1 = 1 AND Column2 = 17
Column1 = 2 AND Column2 = 17

I used a permutation library i found PermuteUtils (
http://www.koders.com/csharp/fid3768...71457A936.aspx
) and the following code:

Dictionary<string, List<string>> distinctCellValues = new
Dictionary<string, List<string>>();
ArrayList queryClause = new ArrayList();

{
foreach (KeyValuePair<string, List<string>> kvp in
distinctCellValues)
{
foreach (string value in kvp.Value)
{
queryClause.Add(kvp.Key + " = " + value);
}
}

//Convert array to string array
string[] queryClauseString = queryClause.ToArray(typeof(string)) as
string[];

CreateFilterPermutations<string>(queryClauseString,
distinctCellValues.Count);
}

private void CreateFilterPermutations<T>(IEnumerable<T> input, int
count)
{
foreach (IEnumerable<T> permutation in
PermuteUtils.Permute<T>(input, count))
{
foreach (T i in permutation)
{
filterExpressions.Add(i);
}
}
}

This seems to work OK as far as running the CreateFilterPermutations
method, where i just cannot get it to do what i need.

I've manage to get myself very confused by all this, and this only
contains 2 columns. Potentially i could need to be generating
permutations of 10 columns/values or more!! I'm hoping someone can
straighten out my thoughts before my head explodes!!

Thanks
 
Reply With Quote
 
 
 
 
Fred Mellender
Guest
Posts: n/a
 
      30th Nov 2007
There is a good chance I don't understand your problem, but here is my take:

I don't think you want the permutations of the array elements, but instead
want a subset of the Cartesian product of the array with itself. E.G. if
the array is A= [a, b, c], the Cartesian product A x A is
{(a,a), (a,b), (a,c), (b,a), (b,b), (b,c), (c,a), (c,b), (c,c)}. The subset
you want excludes an element whose coords are the same, and considers as
duplicates 2 elements that have the same coords (e.g. (a,b) and (b,a) are
the same).

So, you want {(a,b), (a,c), (b,co)}

If you only have a single array, X, crossed only once with itself,
containing more than one element, some potential pseudo code would be:

for (int i = 0; i < x.Length-1; i++)
{
for (int j = i+1; j < x.Length; j++)
{
myFilterList.Add(x[i].MyToString() + " AND " +
x[j].MyToString())
}
}

In your case, x is the list of KeyValue pairs from the dictionary, and you
need to convert each KeyValue to a string via MyToString(), so as to form a
filter, which you add to a list, myFilterList.

What I don't understand about your example:
You have the same key, Column1 associated with two different values. I
don't think the Dictionary allows this.


"Assimalyst" <(E-Mail Removed)> wrote in message
news:8c0f0921-c3a0-432f-a953-(E-Mail Removed)...
> Hi
>
> I have a Dictionary<string, List<string>>, which i have successfully
> filled. My problem is I need to create a filter expression using all
> possible permutations of its contents.
>
> i.e. the dictionary essentially creates the following array:
>
> Key Value
>
> Column1 1
> Column1 2
> Column2 17
>
> I want to then create an number of filter expressions:
>
> Column1 = 1 AND Column2 = 17
> Column1 = 2 AND Column2 = 17
>
> I used a permutation library i found PermuteUtils (
> http://www.koders.com/csharp/fid3768...71457A936.aspx
> ) and the following code:
>
> Dictionary<string, List<string>> distinctCellValues = new
> Dictionary<string, List<string>>();
> ArrayList queryClause = new ArrayList();
>
> {
> foreach (KeyValuePair<string, List<string>> kvp in
> distinctCellValues)
> {
> foreach (string value in kvp.Value)
> {
> queryClause.Add(kvp.Key + " = " + value);
> }
> }
>
> //Convert array to string array
> string[] queryClauseString = queryClause.ToArray(typeof(string)) as
> string[];
>
> CreateFilterPermutations<string>(queryClauseString,
> distinctCellValues.Count);
> }
>
> private void CreateFilterPermutations<T>(IEnumerable<T> input, int
> count)
> {
> foreach (IEnumerable<T> permutation in
> PermuteUtils.Permute<T>(input, count))
> {
> foreach (T i in permutation)
> {
> filterExpressions.Add(i);
> }
> }
> }
>
> This seems to work OK as far as running the CreateFilterPermutations
> method, where i just cannot get it to do what i need.
>
> I've manage to get myself very confused by all this, and this only
> contains 2 columns. Potentially i could need to be generating
> permutations of 10 columns/values or more!! I'm hoping someone can
> straighten out my thoughts before my head explodes!!
>
> Thanks



 
Reply With Quote
 
Assimalyst
Guest
Posts: n/a
 
      30th Nov 2007
Thank you Fred.

I think i had confused myself. Not sure I want permutations but rather
combinations.

Your code sample has given me some ideas that i think i can get
working with a bit of expansion.
I'll keep playing with it . . .

By the way, i think you understood my problem exactly. The bit you
didn't understand was just the way i represented it. I didn't have
duplicate keys it was more like

Column1 { 1, 2 }
Column2 { 17 }

Thanks again


On Nov 30, 6:14 pm, "Fred Mellender" <nospamPlease_fred...@gmail.com>
wrote:
> There is a good chance I don't understand your problem, but here is my take:
>
> I don't think you want the permutations of the array elements, but instead
> want a subset of the Cartesian product of the array with itself. E.G. if
> the array is A= [a, b, c], the Cartesian product A x A is
> {(a,a), (a,b), (a,c), (b,a), (b,b), (b,c), (c,a), (c,b), (c,c)}. The subset
> you want excludes an element whose coords are the same, and considers as
> duplicates 2 elements that have the same coords (e.g. (a,b) and (b,a) are
> the same).
>
> So, you want {(a,b), (a,c), (b,co)}
>
> If you only have a single array, X, crossed only once with itself,
> containing more than one element, some potential pseudo code would be:
>
> for (int i = 0; i < x.Length-1; i++)
> {
> for (int j = i+1; j < x.Length; j++)
> {
> myFilterList.Add(x[i].MyToString() + " AND " +
> x[j].MyToString())
> }
>
> }
>
> In your case, x is the list of KeyValue pairs from the dictionary, and you
> need to convert each KeyValue to a string via MyToString(), so as to form a
> filter, which you add to a list, myFilterList.
>
> What I don't understand about your example:
> You have the same key, Column1 associated with two different values. I
> don't think the Dictionary allows this.
>
> "Assimalyst" <c_oxt...@hotmail.com> wrote in message
>
> news:8c0f0921-c3a0-432f-a953-(E-Mail Removed)...
>
> > Hi

>
> > I have a Dictionary<string, List<string>>, which i have successfully
> > filled. My problem is I need to create a filter expression using all
> > possible permutations of its contents.

>
> > i.e. the dictionary essentially creates the following array:

>
> > Key Value

>
> > Column1 1
> > Column1 2
> > Column2 17

>
> > I want to then create an number of filter expressions:

>
> > Column1 = 1 AND Column2 = 17
> > Column1 = 2 AND Column2 = 17

>
> > I used a permutation library i found PermuteUtils (
> >http://www.koders.com/csharp/fid3768...EE8E638B71457A...
> > ) and the following code:

>
> > Dictionary<string, List<string>> distinctCellValues = new
> > Dictionary<string, List<string>>();
> > ArrayList queryClause = new ArrayList();

>
> > {
> > foreach (KeyValuePair<string, List<string>> kvp in
> > distinctCellValues)
> > {
> > foreach (string value in kvp.Value)
> > {
> > queryClause.Add(kvp.Key + " = " + value);
> > }
> > }

>
> > //Convert array to string array
> > string[] queryClauseString = queryClause.ToArray(typeof(string)) as
> > string[];

>
> > CreateFilterPermutations<string>(queryClauseString,
> > distinctCellValues.Count);
> > }

>
> > private void CreateFilterPermutations<T>(IEnumerable<T> input, int
> > count)
> > {
> > foreach (IEnumerable<T> permutation in
> > PermuteUtils.Permute<T>(input, count))
> > {
> > foreach (T i in permutation)
> > {
> > filterExpressions.Add(i);
> > }
> > }
> > }

>
> > This seems to work OK as far as running the CreateFilterPermutations
> > method, where i just cannot get it to do what i need.

>
> > I've manage to get myself very confused by all this, and this only
> > contains 2 columns. Potentially i could need to be generating
> > permutations of 10 columns/values or more!! I'm hoping someone can
> > straighten out my thoughts before my head explodes!!

>
> > Thanks


 
Reply With Quote
 
 
 
Reply

Thread Tools
Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Create string from List<string> Luigi Z Microsoft C# .NET 4 3rd Dec 2008 03:06 PM
databind a gridview to a dictionary<string, string> only shows 1 row? Andy B Microsoft ASP .NET 2 26th Apr 2008 07:55 PM
serialize dictionary<string, string> collection in .net3.5 Andy B Microsoft C# .NET 6 7th Apr 2008 12:57 PM
Convert Dictionary<string,SomeType> keys to List<string> buzzweetman@gmail.com Microsoft C# .NET 6 9th Aug 2006 03:54 PM
Cannot create an object of type 'System.String[]' from its string representation 'String[] Array' for the 'Options' property. Hessam Microsoft C# .NET 0 8th Aug 2003 09:45 AM


Features
 

Advertising
 

Newsgroups
 


All times are GMT +1. The time now is 08:30 AM.