crafuse
asked on
parse string of id's for number of occurances
Experts,
This was my first attempt at this question, I should have tried to use some of the offered approaches instead of my own:
https://www.experts-exchange.com/questions/27291428/Parse-CSV-string-and-perform-select-listbox-display.html
I have a string that looks like the following, let's call it strCards = "1,1,2,2,2,3,1,3,34,34,34, 23,23,23,2 ,4,4,4,6,6 ,6,1,1,1,9 9,99,34,34 "
These are card_ids. the cards are listed like this (I'd like to include this data within the app, I don't want to make any db calls during this routine.):
id Card Name
1 cardone
2 cardtwo
3 cardthree
4 cardfour
5 cardfive
6 cardsix
etc
I need to be able to parse the strCard and list the CardName and the number of times that card appears in the string in a listbox, so:
cardone 6
cardtwo 3
cardthree 2
cardfour 3
cardsix 3
and so on...
these seem to be the start of what i'm looking for, but i don't understand how to implement\get them going:
from x77:
You can use a Dictionary(of string,Integer) where Id is strin(key), Count is integer
dim sep As Char() = New Char() {","c}
dim cnt as integer
for each v as string in strCardIDs.split(sep,Strin gSplitOpti ons.Remove EmptyEntri es)
if myDict.TryGetValue(v,cnt) then
cnt += 1
myDict(v) = cnt
else
MyDict.Add(v,1)
end if
next
Next enumerate the dictionary (Values, Count) to list values.
from EaswaranP (unfortunately, I need this in VB.NET):
List<int,string> objList = new List<int,string>();
objList.Add(1,"CardOne");
objList.Add(2,"CardTwo");
and so on...
string[] keys = strCardIDs.split(",".ToCha rArray());
List<int,string> objListRest = new List<int,string>();
int val;
for each (string str in keys )
{
int key = Convert.Toint32(str);
if(objListRest.ContainsKey (key))
{
val = objListRest[key];
val ++;
objListRest[key] = val;
}
else
objListRest[key] = 1;
}
This was my first attempt at this question, I should have tried to use some of the offered approaches instead of my own:
https://www.experts-exchange.com/questions/27291428/Parse-CSV-string-and-perform-select-listbox-display.html
I have a string that looks like the following, let's call it strCards = "1,1,2,2,2,3,1,3,34,34,34,
These are card_ids. the cards are listed like this (I'd like to include this data within the app, I don't want to make any db calls during this routine.):
id Card Name
1 cardone
2 cardtwo
3 cardthree
4 cardfour
5 cardfive
6 cardsix
etc
I need to be able to parse the strCard and list the CardName and the number of times that card appears in the string in a listbox, so:
cardone 6
cardtwo 3
cardthree 2
cardfour 3
cardsix 3
and so on...
these seem to be the start of what i'm looking for, but i don't understand how to implement\get them going:
from x77:
You can use a Dictionary(of string,Integer) where Id is strin(key), Count is integer
dim sep As Char() = New Char() {","c}
dim cnt as integer
for each v as string in strCardIDs.split(sep,Strin
if myDict.TryGetValue(v,cnt) then
cnt += 1
myDict(v) = cnt
else
MyDict.Add(v,1)
end if
next
Next enumerate the dictionary (Values, Count) to list values.
from EaswaranP (unfortunately, I need this in VB.NET):
List<int,string> objList = new List<int,string>();
objList.Add(1,"CardOne");
objList.Add(2,"CardTwo");
and so on...
string[] keys = strCardIDs.split(",".ToCha
List<int,string> objListRest = new List<int,string>();
int val;
for each (string str in keys )
{
int key = Convert.Toint32(str);
if(objListRest.ContainsKey
{
val = objListRest[key];
val ++;
objListRest[key] = val;
}
else
objListRest[key] = 1;
}
ASKER
cool, just heading home from work, will try that when i get home...
btw, is this VB or C#? can't tell...
also, i need to use this in a few different places, can i set that dictionary up once somewhere?
thanks...
btw, is this VB or C#? can't tell...
also, i need to use this in a few different places, can i set that dictionary up once somewhere?
thanks...
This is c#, but it's almost entirely LINQ so it should translate pretty easily.
You should be able to set the dictionary of cards up once, and pass whatever idList you want to into it and get the result counts the same way.
You should be able to set the dictionary of cards up once, and pass whatever idList you want to into it and get the result counts the same way.
ASKER
so, you can't make it VB? if not, what changes do I need to make?
i'm pretty much looking for a complete answer, or at least precise instruction...
thanks,
crafuse
i'm pretty much looking for a complete answer, or at least precise instruction...
thanks,
crafuse
ASKER
nixkuroi -
could i trouble you to make this answer complete so that it works in VB, including declaring variables, etc?
thnx.
could i trouble you to make this answer complete so that it works in VB, including declaring variables, etc?
thnx.
Sure,
Dim cards = New Dictionary(Of Integer, String) From {{1, "cardone"}, {2, "cardtwo"}, {3, "cardthree"}, {4, "cardfour"}, {6, "cardsix"}, {34, "cardthirtyfour"}, {23, "cardtwentythree"}, {99, "cardninetynine"}}
Dim idList = "1,1,2,2,2,3,1,3,34,34,34, 23,23,23,2 ,4,4,4,6,6 ,6,1,1,1,9 9,99,34,34 ".Split(", ".ToCharAr ray()).ToL ist().Conv ertAll(Fun ction(c) Convert.ToInt32(c)).ToList ()
Dim countList = New Dictionary(Of String, Integer)
For Each k As Integer In cards.Keys
countList.Add(cards(k), idList.Where(Function(w) w = k).ToList().Count)
Next
Dim cards = New Dictionary(Of Integer, String) From {{1, "cardone"}, {2, "cardtwo"}, {3, "cardthree"}, {4, "cardfour"}, {6, "cardsix"}, {34, "cardthirtyfour"}, {23, "cardtwentythree"}, {99, "cardninetynine"}}
Dim idList = "1,1,2,2,2,3,1,3,34,34,34,
Dim countList = New Dictionary(Of String, Integer)
For Each k As Integer In cards.Keys
countList.Add(cards(k), idList.Where(Function(w) w = k).ToList().Count)
Next
Sorry, that didn't paste correctly
Dim cards = New Dictionary(Of Integer, String) From
{
{1, "cardone"},
{2, "cardtwo"},
{3, "cardthree"},
{4, "cardfour"},
{6, "cardsix"},
{34, "cardthirtyfour"},
{23, "cardtwentythree"},
{99, "cardninetynine"}
}
Dim idList = "1,1,2,2,2,3,1,3,34,34,34,23,23,23,2,4,4,4,6,6,6,1,1,1,99,99,34,34".Split(",".ToCharArray()).ToList().ConvertAll(Function(c) Convert.ToInt32(c)).ToList()
Dim countList = New Dictionary(Of String, Integer)
For Each k As Integer In cards.Keys
countList.Add(cards(k), idList.Where(Function(w) w = k).ToList().Count)
Next
Make sure you import the following:
Imports System.Collections.Generic
Imports System.Collections.Generic
ASKER
i modified the code as below. but it's not precisely what i'm looking for. if the cardid does not appear in the string it should not appear as, for example,
CardThirtyFour 0
That's what i get with the code below, take out a card id from the string, but it appears with cardname and 0 as the count.
CardThirtyFour 0
That's what i get with the code below, take out a card id from the string, but it appears with cardname and 0 as the count.
Dim cards = New Dictionary(Of Integer, String) From
{
{1, "cardone"},
{2, "cardtwo"},
{3, "cardthree"},
{4, "cardfour"},
{6, "cardsix"},
{34, "cardthirtyfour"},
{23, "cardtwentythree"},
{99, "cardninetynine"}
}
Dim idList = "1,1,2,2,2,3,1,3,23,23,23,2,4,4,4,6,6,6,1,1,1,99,99".Split(",".ToCharArray()).ToList().ConvertAll(Function(c) Convert.ToInt32(c)).ToList()
Dim countList = New Dictionary(Of String, Integer)
For Each k As Integer In cards.Keys
countList.Add(cards(k), idList.Where(Function(w) w = k).ToList().Count)
ListBox1.Items.Add(cards(k) & " " & idList.Where(Function(w) w = k).ToList().Count)
Next
End Sub
So in that case, replace the For Each line with this:
For Each k As Integer In cards.Keys.Where(Function( c) idList.Contains(c) = True)
For Each k As Integer In cards.Keys.Where(Function(
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
sweet, thanks fellas. i've learned a lot.
went with the dictionary approach instead of enums for a few different reasons.
went with the dictionary approach instead of enums for a few different reasons.
ASKER
Fernando -
wondering if you could help me here, trying to get your code to work so that i can dump the results into a string so that i can display in a rich textbox. can't seem to get it to work...
Dim idList = "1,1,2,2,2,3,1,3,23,23,23, 2,4,4,4,6, 6,6,1,1,1, 99,99".Spl it(",".ToC harArray() ).ToList() .ConvertAl l(Function (c) Convert.ToInt32(c)).ToList ()
Dim countList = New Dictionary(Of String, Integer)
Dim result = (From id In idList
Where cards.Keys.Contains(id)
Group id By Key = id Into Group
Order By Key
Select String.Format("{0,-20}{1}{ 2}", cards(Key), vbTab, Group.Count())).ToArray()
* * * * * ListBox1.Items.AddRange(re sult) * * * * * at this point i'd like to assign the result value to a string, but can't seem to get it to work...
Thanks...
wondering if you could help me here, trying to get your code to work so that i can dump the results into a string so that i can display in a rich textbox. can't seem to get it to work...
Dim idList = "1,1,2,2,2,3,1,3,23,23,23,
Dim countList = New Dictionary(Of String, Integer)
Dim result = (From id In idList
Where cards.Keys.Contains(id)
Group id By Key = id Into Group
Order By Key
Select String.Format("{0,-20}{1}{
* * * * * ListBox1.Items.AddRange(re
Thanks...
Hi crafuse;
The result variable already holds a array of String data type. To place the information into a RichTextBox just do the following:
RichTextBox1.Lines = result
Fernando
The result variable already holds a array of String data type. To place the information into a RichTextBox just do the following:
RichTextBox1.Lines = result
Fernando
List<int> idList = "1,1,2,2,2,3,1,3,34,34,34,
idList.Sort();
Dictionary<int, string> cards = new Dictionary<int, string>
{
{1,"cardone"},
{2,"cardtwo"},
{3,"cardthree"},
{4,"cardfour"},
{6,"cardsix"},
{34,"cardthirtyfour"},
{23,"cardtwentythree"},
{99,"cardninetynine"}
};
Dictionary<string,int> countList = new Dictionary<string,int>();
cards.Keys.ToList().ForEac