|
web
newsgroups
|
|||||||||||||||||||||||
|
|||||||||||||||||||||||
what collection obj can hold 3 parameters per index?Yes, I need to store some values in an array type collection object that can
hold 3 or more parameters per index. I have looked at the collection object, hashtable object and would prefer not to hassel with a multi-dimensional array. Is there such an object in VB.Net? Dim obj As someCollectionObj obj.Add("parmA1", "parmA2", "parmA3") obj.Add("parmB1", "parmB2", "parmB3") .... retrieve items s = obj.Item("parmA1", 1) t = obj.Item("parmA1", 2) or, can a Hashtable contain a hashtable? Thanks, Rich I tried writing a collection type class, but it does not return anything.
What do I need to do to it so that it returns the values? Sub Form_Load(...) dim x As New clsSubScr dim i As Integer, str1 As String x.MailSrv = "test1" x.MailSrv = "test2" x.Mailsrv = "test3" For i = 1 To 3 x.coIDx = i str1 = x.Mailsrv '<---this gets nothing even though the collect object contains Console.Writeline(str1) ' the values "test1", "test2", "test3" Next Class clsSubScr Dim colmailSrv As New Collection, colListNO As New Collection Dim colID As New Collection Public coIdx As Integer Dim str1 As String Property mailSrv() As String Get str1 = colmailSrv(coIdx) End Get Set(ByVal Value As String) colmailSrv.Add(Value) End Set End Property Property listNO() As String Get str1 = colListNO(coIdx) End Get Set(ByVal Value As String) colListNO.Add(Value) End Set End Property Property listID() As String Get str1 = colID(coIdx) End Get Set(ByVal Value As String) colID.Add(Value) End Set End Property End Class Thanks, Rich Why not make a structure for holding parameters and then add that to an
hashtable? Public Structure Item Dim ParamA2 As String Dim ParamA3 As String Public Sub New (a2 as String, a3 As String) ParamA2 = a2 ParamA3 = a3 End Sub End Structure Dim obj As New HashTable obj.Add("paramA1", New Item("paramA2", "paramA3")) obj.Add("paramB1", New Item("paramB2", "paramB3")) s = obj("paramA1").ParamA2 t = obj("paramA1").ParamA3 And yes, a hashtable can contain a hashtable. Thanks. I will give this a go. Structure - yes - easier than a class.
Show quoteHide quote "Chris Dunaway" wrote: > Why not make a structure for holding parameters and then add that to an > hashtable? > > Public Structure Item > Dim ParamA2 As String > Dim ParamA3 As String > > Public Sub New (a2 as String, a3 As String) > ParamA2 = a2 > ParamA3 = a3 > End Sub > End Structure > > Dim obj As New HashTable > > obj.Add("paramA1", New Item("paramA2", "paramA3")) > obj.Add("paramB1", New Item("paramB2", "paramB3")) > > s = obj("paramA1").ParamA2 > t = obj("paramA1").ParamA3 > > > > And yes, a hashtable can contain a hashtable. > > This trick works pretty nicely. Should do the trick. Thanks
Show quoteHide quote "Chris Dunaway" wrote: > Why not make a structure for holding parameters and then add that to an > hashtable? > > Public Structure Item > Dim ParamA2 As String > Dim ParamA3 As String > > Public Sub New (a2 as String, a3 As String) > ParamA2 = a2 > ParamA3 = a3 > End Sub > End Structure > > Dim obj As New HashTable > > obj.Add("paramA1", New Item("paramA2", "paramA3")) > obj.Add("paramB1", New Item("paramB2", "paramB3")) > > s = obj("paramA1").ParamA2 > t = obj("paramA1").ParamA3 > > > > And yes, a hashtable can contain a hashtable. > > Rich,
One option is to create a class with 3 properties representing the parameter data. Then create an object from the class, fill in the 3 properties with the parameter values and add the object to an arraylist. Kerry Moorman Show quoteHide quote "Rich" wrote: > Yes, I need to store some values in an array type collection object that can > hold 3 or more parameters per index. I have looked at the collection object, > hashtable object and would prefer not to hassel with a multi-dimensional > array. Is there such an object in VB.Net? > > Dim obj As someCollectionObj > obj.Add("parmA1", "parmA2", "parmA3") > obj.Add("parmB1", "parmB2", "parmB3") > ... > > retrieve items > s = obj.Item("parmA1", 1) > t = obj.Item("parmA1", 2) > > or, can a Hashtable contain a hashtable? > > Thanks, > Rich Rich,
| I need to store some values in an array type collection object that can It sounds like you want a collection of collections. Is the outer collection | hold 3 or more parameters per index. keyed or not keyed? Is the inner collection keyed or not keyed? In other words is row one known by a specific Key or simply as row one? | would prefer not to hassel with a multi-dimensional Rather then a 2 dimensional array, have you considered an array of arrays?| array. Dim block(10,10) as String ' 2 dimensional array each row = 10, each column is 10 Dim jagged(10)() As String ' ragged/jagged array, 10 rows or 0 or more elements. Have you looked at the NameValueCollection? http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemcollectionsspecializednamevaluecollectionclasstopic.asp It associates a String Key with one or more String values. If your values and/or keys are not strings NameValueCollection probably won't work... | retrieve items You may need to define a custom collection that encapsulates one of the | s = obj.Item("parmA1", 1) | t = obj.Item("parmA1", 2) above for storage. -- Show quoteHide quoteHope this helps Jay [MVP - Outlook] ..NET Application Architect, Enthusiast, & Evangelist T.S. Bradley - http://www.tsbradley.net "Rich" <R***@discussions.microsoft.com> wrote in message news:AB120169-40F6-449B-8768-7F6AA9469D6C@microsoft.com... | Yes, I need to store some values in an array type collection object that can | hold 3 or more parameters per index. I have looked at the collection object, | hashtable object and would prefer not to hassel with a multi-dimensional | array. Is there such an object in VB.Net? | | Dim obj As someCollectionObj | obj.Add("parmA1", "parmA2", "parmA3") | obj.Add("parmB1", "parmB2", "parmB3") | ... | | retrieve items | s = obj.Item("parmA1", 1) | t = obj.Item("parmA1", 2) | | or, can a Hashtable contain a hashtable? | | Thanks, | Rich Thanks for your suggestion of the NameValueCollection. May I ask if you
could share an example how it is used? As for keys, the first element in each row is unique so that could be a key. Else, I was just going to loop through the collection. But I tried writing a class with the 3 properties of the stuff I need to store. But I can't retrieve the values. The class effort is my 2nd post in this thread. Would you have any suggestions what I could do to the class to make it work? One other suggestion I got was to use a Hashtable with a structure. The also seems like a good idea. Rich Show quoteHide quote "Jay B. Harlow [MVP - Outlook]" wrote: > Rich, > | I need to store some values in an array type collection object that can > | hold 3 or more parameters per index. > > It sounds like you want a collection of collections. Is the outer collection > keyed or not keyed? Is the inner collection keyed or not keyed? In other > words is row one known by a specific Key or simply as row one? > > | would prefer not to hassel with a multi-dimensional > | array. > Rather then a 2 dimensional array, have you considered an array of arrays? > > Dim block(10,10) as String ' 2 dimensional array each row = 10, each > column is 10 > > Dim jagged(10)() As String ' ragged/jagged array, 10 rows or 0 or more > elements. > > > Have you looked at the NameValueCollection? > > http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemcollectionsspecializednamevaluecollectionclasstopic.asp > > It associates a String Key with one or more String values. If your values > and/or keys are not strings NameValueCollection probably won't work... > > | retrieve items > | s = obj.Item("parmA1", 1) > | t = obj.Item("parmA1", 2) > You may need to define a custom collection that encapsulates one of the > above for storage. > > -- > Hope this helps > Jay [MVP - Outlook] > ..NET Application Architect, Enthusiast, & Evangelist > T.S. Bradley - http://www.tsbradley.net > > > "Rich" <R***@discussions.microsoft.com> wrote in message > news:AB120169-40F6-449B-8768-7F6AA9469D6C@microsoft.com... > | Yes, I need to store some values in an array type collection object that > can > | hold 3 or more parameters per index. I have looked at the collection > object, > | hashtable object and would prefer not to hassel with a multi-dimensional > | array. Is there such an object in VB.Net? > | > | Dim obj As someCollectionObj > | obj.Add("parmA1", "parmA2", "parmA3") > | obj.Add("parmB1", "parmB2", "parmB3") > | ... > | > | retrieve items > | s = obj.Item("parmA1", 1) > | t = obj.Item("parmA1", 2) > | > | or, can a Hashtable contain a hashtable? > | > | Thanks, > | Rich > > > | Thanks for your suggestion of the NameValueCollection. May I ask if you Dim list As New System.Collections.Specialized.NameValueCollection| could share an example how it is used? list.Add("parmA1", "parmA2") list.Add("parmA1", "parmA3") list.Add("parmB1", "parmB2") list.Add("parmB1", "parmB3") Dim a1 As String Dim b1 As String a1 = list.Item("parmA1") b1 = list.Item("parmB1") Dim a1s() As String = list.Item("parmA1").Split(","c) Dim b1s() As String = list.Item("parmB1").Split(","c) If you like you could encapsulate some of the logic into a custom version of NameValueCollection that supported adding a list of values for a key & returning one value for a key, something like: Public Class someCollectionObj Inherits System.Collections.Specialized.NameValueCollection Public Overloads Sub Add(ByVal key As String, ByVal ParamArray values() As String) For Each value As String In values Add(key, value) Next End Sub Default Public Overloads ReadOnly Property Item(ByVal key As String, ByVal index As Integer) As String Get Dim values() As String = Item(key).Split(","c) Return values(index) End Get End Property Public ReadOnly Property ItemCount(ByVal key As String) As Integer Get Return Item(key).Split(","c).Length End Get End Property End Class Then you could use the above, something like: Dim list As New someCollectionObj list.Add("parmA1", "parmA2", "parmA3") list.Add("parmB1", "parmB2", "parmB3", "parmB4") For Each key As String In list.Keys Debug.WriteLine(Nothing, key) Debug.Indent() For index As Integer = 0 To list.ItemCount(key) - 1 Debug.WriteLine(list.Item(key, index), "item " & index) Next Debug.Unindent() Next I would consider adding an indexers like: Default Public Overloads ReadOnly Property Item(ByVal key As String) As String() Get Return MyBase.Item(key).Split(","c) End Get End Property Default Public Overloads ReadOnly Property Item(ByVal index As Integer) As String() Get Return MyBase.Item(index).Split(","c) End Get End Property Which return an array of strings for a key/index rather then the comma delimited string. I might also consider an indexer something like: Default Public Overloads ReadOnly Property Item(ByVal indexKey As Integer, ByVal indexValue As Integer) As String Get Dim values() As String = MyBase.Item(indexKey).Split(","c) Return values(indexValue) End Get End Property If I needed to index that way... -- Show quoteHide quoteHope this helps Jay [MVP - Outlook] ..NET Application Architect, Enthusiast, & Evangelist T.S. Bradley - http://www.tsbradley.net "Rich" <R***@discussions.microsoft.com> wrote in message http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemcollectionsspecializednamevaluecollectionclasstopic.aspnews:441DE84C-DF14-41A4-954C-17A29548E9DE@microsoft.com... | Thanks for your suggestion of the NameValueCollection. May I ask if you | could share an example how it is used? | | As for keys, the first element in each row is unique so that could be a key. | Else, I was just going to loop through the collection. But I tried writing | a class with the 3 properties of the stuff I need to store. But I can't | retrieve the values. The class effort is my 2nd post in this thread. Would | you have any suggestions what I could do to the class to make it work? | | One other suggestion I got was to use a Hashtable with a structure. The | also seems like a good idea. | | Rich | | "Jay B. Harlow [MVP - Outlook]" wrote: | | > Rich, | > | I need to store some values in an array type collection object that can | > | hold 3 or more parameters per index. | > | > It sounds like you want a collection of collections. Is the outer collection | > keyed or not keyed? Is the inner collection keyed or not keyed? In other | > words is row one known by a specific Key or simply as row one? | > | > | would prefer not to hassel with a multi-dimensional | > | array. | > Rather then a 2 dimensional array, have you considered an array of arrays? | > | > Dim block(10,10) as String ' 2 dimensional array each row = 10, each | > column is 10 | > | > Dim jagged(10)() As String ' ragged/jagged array, 10 rows or 0 or more | > elements. | > | > | > Have you looked at the NameValueCollection? | > | > Show quoteHide quote | > | > It associates a String Key with one or more String values. If your values | > and/or keys are not strings NameValueCollection probably won't work... | > | > | retrieve items | > | s = obj.Item("parmA1", 1) | > | t = obj.Item("parmA1", 2) | > You may need to define a custom collection that encapsulates one of the | > above for storage. | > | > -- | > Hope this helps | > Jay [MVP - Outlook] | > ..NET Application Architect, Enthusiast, & Evangelist | > T.S. Bradley - http://www.tsbradley.net | > | > | > "Rich" <R***@discussions.microsoft.com> wrote in message | > news:AB120169-40F6-449B-8768-7F6AA9469D6C@microsoft.com... | > | Yes, I need to store some values in an array type collection object that | > can | > | hold 3 or more parameters per index. I have looked at the collection | > object, | > | hashtable object and would prefer not to hassel with a multi-dimensional | > | array. Is there such an object in VB.Net? | > | | > | Dim obj As someCollectionObj | > | obj.Add("parmA1", "parmA2", "parmA3") | > | obj.Add("parmB1", "parmB2", "parmB3") | > | ... | > | | > | retrieve items | > | s = obj.Item("parmA1", 1) | > | t = obj.Item("parmA1", 2) | > | | > | or, can a Hashtable contain a hashtable? | > | | > | Thanks, | > | Rich | > | > | > Doh!
| Public Overloads Sub Add(ByVal key As String, ByVal ParamArray The above code assumes that not passing any values is NOT a problem. which | values() As String) | For Each value As String In values | Add(key, value) | Next | End Sub may or may not be a valid assumption. Is: list.Add("parmA1") Valid? -- Show quoteHide quoteHope this helps Jay [MVP - Outlook] ..NET Application Architect, Enthusiast, & Evangelist T.S. Bradley - http://www.tsbradley.net "Jay B. Harlow [MVP - Outlook]" <Jay_Harlow_***@tsbradley.net> wrote in http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemcollectionsspecializednamevaluecollectionclasstopic.aspmessage news:%23dVjPosIGHA.1388@TK2MSFTNGP11.phx.gbl... || Thanks for your suggestion of the NameValueCollection. May I ask if you || could share an example how it is used? | | Dim list As New System.Collections.Specialized.NameValueCollection | list.Add("parmA1", "parmA2") | list.Add("parmA1", "parmA3") | list.Add("parmB1", "parmB2") | list.Add("parmB1", "parmB3") | | Dim a1 As String | Dim b1 As String | a1 = list.Item("parmA1") | b1 = list.Item("parmB1") | | Dim a1s() As String = list.Item("parmA1").Split(","c) | Dim b1s() As String = list.Item("parmB1").Split(","c) | | If you like you could encapsulate some of the logic into a custom version of | NameValueCollection that supported adding a list of values for a key & | returning one value for a key, something like: | | Public Class someCollectionObj | Inherits System.Collections.Specialized.NameValueCollection | | Public Overloads Sub Add(ByVal key As String, ByVal ParamArray | values() As String) | For Each value As String In values | Add(key, value) | Next | End Sub | | Default Public Overloads ReadOnly Property Item(ByVal key As String, | ByVal index As Integer) As String | Get | Dim values() As String = Item(key).Split(","c) | Return values(index) | End Get | End Property | | Public ReadOnly Property ItemCount(ByVal key As String) As Integer | Get | Return Item(key).Split(","c).Length | End Get | End Property | | End Class | | Then you could use the above, something like: | | Dim list As New someCollectionObj | list.Add("parmA1", "parmA2", "parmA3") | list.Add("parmB1", "parmB2", "parmB3", "parmB4") | | For Each key As String In list.Keys | Debug.WriteLine(Nothing, key) | Debug.Indent() | For index As Integer = 0 To list.ItemCount(key) - 1 | Debug.WriteLine(list.Item(key, index), "item " & index) | Next | Debug.Unindent() | Next | | I would consider adding an indexers like: | | Default Public Overloads ReadOnly Property Item(ByVal key As String) | As String() | Get | Return MyBase.Item(key).Split(","c) | End Get | End Property | | Default Public Overloads ReadOnly Property Item(ByVal index As | Integer) As String() | Get | Return MyBase.Item(index).Split(","c) | End Get | End Property | | Which return an array of strings for a key/index rather then the comma | delimited string. | | I might also consider an indexer something like: | | Default Public Overloads ReadOnly Property Item(ByVal indexKey As | Integer, ByVal indexValue As Integer) As String | Get | Dim values() As String = MyBase.Item(indexKey).Split(","c) | Return values(indexValue) | End Get | End Property | | If I needed to index that way... | | -- | Hope this helps | Jay [MVP - Outlook] | .NET Application Architect, Enthusiast, & Evangelist | T.S. Bradley - http://www.tsbradley.net | | | "Rich" <R***@discussions.microsoft.com> wrote in message | news:441DE84C-DF14-41A4-954C-17A29548E9DE@microsoft.com... || Thanks for your suggestion of the NameValueCollection. May I ask if you || could share an example how it is used? || || As for keys, the first element in each row is unique so that could be a | key. || Else, I was just going to loop through the collection. But I tried | writing || a class with the 3 properties of the stuff I need to store. But I can't || retrieve the values. The class effort is my 2nd post in this thread. | Would || you have any suggestions what I could do to the class to make it work? || || One other suggestion I got was to use a Hashtable with a structure. The || also seems like a good idea. || || Rich || || "Jay B. Harlow [MVP - Outlook]" wrote: || || > Rich, || > | I need to store some values in an array type collection object that | can || > | hold 3 or more parameters per index. || > || > It sounds like you want a collection of collections. Is the outer | collection || > keyed or not keyed? Is the inner collection keyed or not keyed? In other || > words is row one known by a specific Key or simply as row one? || > || > | would prefer not to hassel with a multi-dimensional || > | array. || > Rather then a 2 dimensional array, have you considered an array of | arrays? || > || > Dim block(10,10) as String ' 2 dimensional array each row = 10, each || > column is 10 || > || > Dim jagged(10)() As String ' ragged/jagged array, 10 rows or 0 or | more || > elements. || > || > || > Have you looked at the NameValueCollection? || > || > | Show quoteHide quote || > || > It associates a String Key with one or more String values. If your | values || > and/or keys are not strings NameValueCollection probably won't work... || > || > | retrieve items || > | s = obj.Item("parmA1", 1) || > | t = obj.Item("parmA1", 2) || > You may need to define a custom collection that encapsulates one of the || > above for storage. || > || > -- || > Hope this helps || > Jay [MVP - Outlook] || > ..NET Application Architect, Enthusiast, & Evangelist || > T.S. Bradley - http://www.tsbradley.net || > || > || > "Rich" <R***@discussions.microsoft.com> wrote in message || > news:AB120169-40F6-449B-8768-7F6AA9469D6C@microsoft.com... || > | Yes, I need to store some values in an array type collection object | that || > can || > | hold 3 or more parameters per index. I have looked at the collection || > object, || > | hashtable object and would prefer not to hassel with a | multi-dimensional || > | array. Is there such an object in VB.Net? || > | || > | Dim obj As someCollectionObj || > | obj.Add("parmA1", "parmA2", "parmA3") || > | obj.Add("parmB1", "parmB2", "parmB3") || > | ... || > | || > | retrieve items || > | s = obj.Item("parmA1", 1) || > | t = obj.Item("parmA1", 2) || > | || > | or, can a Hashtable contain a hashtable? || > | || > | Thanks, || > | Rich || > || > || > | | >> The above code assumes that not passing any values is NOT a problem. which ------------------------------------------------------------------------------ Doh! | Public Overloads Sub Add(ByVal key As String, ByVal ParamArray | values() As String) | For Each value As String In values | Add(key, value) | Next | End Sub may or may not be a valid assumption. Is: list.Add("parmA1") Valid? ----------------------------------------------------------------------- << if you have Function Add(ByVal key As String, ByVal ParamArray args As String()) As String Dim s, t As String For Each s In args t += ", " & s Next Return key & t End Function Sub x() Dim str1 As String str1 = Add("1", "a, b, c, d") returns "1, a. b. c, d" str1 = Add("1") returns "1" Are you suggesting this would be a problem in your sample class? Show quoteHide quote "Jay B. Harlow [MVP - Outlook]" wrote: > Doh! > | Public Overloads Sub Add(ByVal key As String, ByVal ParamArray > | values() As String) > | For Each value As String In values > | Add(key, value) > | Next > | End Sub > The above code assumes that not passing any values is NOT a problem. which > may or may not be a valid assumption. > > Is: > > list.Add("parmA1") > > Valid? > > > > -- > Hope this helps > Jay [MVP - Outlook] > ..NET Application Architect, Enthusiast, & Evangelist > T.S. Bradley - http://www.tsbradley.net > > > "Jay B. Harlow [MVP - Outlook]" <Jay_Harlow_***@tsbradley.net> wrote in > message news:%23dVjPosIGHA.1388@TK2MSFTNGP11.phx.gbl... > || Thanks for your suggestion of the NameValueCollection. May I ask if you > || could share an example how it is used? > | > | Dim list As New System.Collections.Specialized.NameValueCollection > | list.Add("parmA1", "parmA2") > | list.Add("parmA1", "parmA3") > | list.Add("parmB1", "parmB2") > | list.Add("parmB1", "parmB3") > | > | Dim a1 As String > | Dim b1 As String > | a1 = list.Item("parmA1") > | b1 = list.Item("parmB1") > | > | Dim a1s() As String = list.Item("parmA1").Split(","c) > | Dim b1s() As String = list.Item("parmB1").Split(","c) > | > | If you like you could encapsulate some of the logic into a custom version > of > | NameValueCollection that supported adding a list of values for a key & > | returning one value for a key, something like: > | > | Public Class someCollectionObj > | Inherits System.Collections.Specialized.NameValueCollection > | > | Public Overloads Sub Add(ByVal key As String, ByVal ParamArray > | values() As String) > | For Each value As String In values > | Add(key, value) > | Next > | End Sub > | > | Default Public Overloads ReadOnly Property Item(ByVal key As > String, > | ByVal index As Integer) As String > | Get > | Dim values() As String = Item(key).Split(","c) > | Return values(index) > | End Get > | End Property > | > | Public ReadOnly Property ItemCount(ByVal key As String) As Integer > | Get > | Return Item(key).Split(","c).Length > | End Get > | End Property > | > | End Class > | > | Then you could use the above, something like: > | > | Dim list As New someCollectionObj > | list.Add("parmA1", "parmA2", "parmA3") > | list.Add("parmB1", "parmB2", "parmB3", "parmB4") > | > | For Each key As String In list.Keys > | Debug.WriteLine(Nothing, key) > | Debug.Indent() > | For index As Integer = 0 To list.ItemCount(key) - 1 > | Debug.WriteLine(list.Item(key, index), "item " & index) > | Next > | Debug.Unindent() > | Next > | > | I would consider adding an indexers like: > | > | Default Public Overloads ReadOnly Property Item(ByVal key As > String) > | As String() > | Get > | Return MyBase.Item(key).Split(","c) > | End Get > | End Property > | > | Default Public Overloads ReadOnly Property Item(ByVal index As > | Integer) As String() > | Get > | Return MyBase.Item(index).Split(","c) > | End Get > | End Property > | > | Which return an array of strings for a key/index rather then the comma > | delimited string. > | > | I might also consider an indexer something like: > | > | Default Public Overloads ReadOnly Property Item(ByVal indexKey As > | Integer, ByVal indexValue As Integer) As String > | Get > | Dim values() As String = MyBase.Item(indexKey).Split(","c) > | Return values(indexValue) > | End Get > | End Property > | > | If I needed to index that way... > | > | -- > | Hope this helps > | Jay [MVP - Outlook] > | .NET Application Architect, Enthusiast, & Evangelist > | T.S. Bradley - http://www.tsbradley.net > | > | > | "Rich" <R***@discussions.microsoft.com> wrote in message > | news:441DE84C-DF14-41A4-954C-17A29548E9DE@microsoft.com... > || Thanks for your suggestion of the NameValueCollection. May I ask if you > || could share an example how it is used? > || > || As for keys, the first element in each row is unique so that could be a > | key. > || Else, I was just going to loop through the collection. But I tried > | writing > || a class with the 3 properties of the stuff I need to store. But I can't > || retrieve the values. The class effort is my 2nd post in this thread. > | Would > || you have any suggestions what I could do to the class to make it work? > || > || One other suggestion I got was to use a Hashtable with a structure. The > || also seems like a good idea. > || > || Rich > || > || "Jay B. Harlow [MVP - Outlook]" wrote: > || > || > Rich, > || > | I need to store some values in an array type collection object that > | can > || > | hold 3 or more parameters per index. > || > > || > It sounds like you want a collection of collections. Is the outer > | collection > || > keyed or not keyed? Is the inner collection keyed or not keyed? In > other > || > words is row one known by a specific Key or simply as row one? > || > > || > | would prefer not to hassel with a multi-dimensional > || > | array. > || > Rather then a 2 dimensional array, have you considered an array of > | arrays? > || > > || > Dim block(10,10) as String ' 2 dimensional array each row = 10, > each > || > column is 10 > || > > || > Dim jagged(10)() As String ' ragged/jagged array, 10 rows or 0 or > | more > || > elements. > || > > || > > || > Have you looked at the NameValueCollection? > || > > || > > | > http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemcollectionsspecializednamevaluecollectionclasstopic.asp > || > > || > It associates a String Key with one or more String values. If your > | values > || > and/or keys are not strings NameValueCollection probably won't work... > || > > || > | retrieve items > || > | s = obj.Item("parmA1", 1) > || > | t = obj.Item("parmA1", 2) > || > You may need to define a custom collection that encapsulates one of the > || > above for storage. > || > > || > -- > || > Hope this helps > || > Jay [MVP - Outlook] > || > ..NET Application Architect, Enthusiast, & Evangelist > || > T.S. Bradley - http://www.tsbradley.net > || > > || > > || > "Rich" <R***@discussions.microsoft.com> wrote in message > || > news:AB120169-40F6-449B-8768-7F6AA9469D6C@microsoft.com... > || > | Yes, I need to store some values in an array type collection object > | that > || > can > || > | hold 3 or more parameters per index. I have looked at the collection > || > object, > || > | hashtable object and would prefer not to hassel with a > | multi-dimensional > || > | array. Is there such an object in VB.Net? > || > | > || > | Dim obj As someCollectionObj > || > | obj.Add("parmA1", "parmA2", "parmA3") > || > | obj.Add("parmB1", "parmB2", "parmB3") > || > | ... > || > | > || > | retrieve items > || > | s = obj.Item("parmA1", 1) > || > | t = obj.Item("parmA1", 2) > || > | > || > | or, can a Hashtable contain a hashtable? > || > | > || > | Thanks, > || > | Rich > || > > || > > || > > | > | > > > OK. I tried your class with these args
list.Add("parmA1", "parmA2", "parmA3") list.Add("parmB1", "parmB2", "parmB3", "parmB4") The object returns parmA1: item 0: parmA2 item 1: parmA3 parmB1: item 0: parmB2 item 1: parmB3 item 2: parmB4 I don't see any problems. Show quoteHide quote "Jay B. Harlow [MVP - Outlook]" wrote: > Doh! > | Public Overloads Sub Add(ByVal key As String, ByVal ParamArray > | values() As String) > | For Each value As String In values > | Add(key, value) > | Next > | End Sub > The above code assumes that not passing any values is NOT a problem. which > may or may not be a valid assumption. > > Is: > > list.Add("parmA1") > > Valid? > > > > -- > Hope this helps > Jay [MVP - Outlook] > ..NET Application Architect, Enthusiast, & Evangelist > T.S. Bradley - http://www.tsbradley.net > > > "Jay B. Harlow [MVP - Outlook]" <Jay_Harlow_***@tsbradley.net> wrote in > message news:%23dVjPosIGHA.1388@TK2MSFTNGP11.phx.gbl... > || Thanks for your suggestion of the NameValueCollection. May I ask if you > || could share an example how it is used? > | > | Dim list As New System.Collections.Specialized.NameValueCollection > | list.Add("parmA1", "parmA2") > | list.Add("parmA1", "parmA3") > | list.Add("parmB1", "parmB2") > | list.Add("parmB1", "parmB3") > | > | Dim a1 As String > | Dim b1 As String > | a1 = list.Item("parmA1") > | b1 = list.Item("parmB1") > | > | Dim a1s() As String = list.Item("parmA1").Split(","c) > | Dim b1s() As String = list.Item("parmB1").Split(","c) > | > | If you like you could encapsulate some of the logic into a custom version > of > | NameValueCollection that supported adding a list of values for a key & > | returning one value for a key, something like: > | > | Public Class someCollectionObj > | Inherits System.Collections.Specialized.NameValueCollection > | > | Public Overloads Sub Add(ByVal key As String, ByVal ParamArray > | values() As String) > | For Each value As String In values > | Add(key, value) > | Next > | End Sub > | > | Default Public Overloads ReadOnly Property Item(ByVal key As > String, > | ByVal index As Integer) As String > | Get > | Dim values() As String = Item(key).Split(","c) > | Return values(index) > | End Get > | End Property > | > | Public ReadOnly Property ItemCount(ByVal key As String) As Integer > | Get > | Return Item(key).Split(","c).Length > | End Get > | End Property > | > | End Class > | > | Then you could use the above, something like: > | > | Dim list As New someCollectionObj > | list.Add("parmA1", "parmA2", "parmA3") > | list.Add("parmB1", "parmB2", "parmB3", "parmB4") > | > | For Each key As String In list.Keys > | Debug.WriteLine(Nothing, key) > | Debug.Indent() > | For index As Integer = 0 To list.ItemCount(key) - 1 > | Debug.WriteLine(list.Item(key, index), "item " & index) > | Next > | Debug.Unindent() > | Next > | > | I would consider adding an indexers like: > | > | Default Public Overloads ReadOnly Property Item(ByVal key As > String) > | As String() > | Get > | Return MyBase.Item(key).Split(","c) > | End Get > | End Property > | > | Default Public Overloads ReadOnly Property Item(ByVal index As > | Integer) As String() > | Get > | Return MyBase.Item(index).Split(","c) > | End Get > | End Property > | > | Which return an array of strings for a key/index rather then the comma > | delimited string. > | > | I might also consider an indexer something like: > | > | Default Public Overloads ReadOnly Property Item(ByVal indexKey As > | Integer, ByVal indexValue As Integer) As String > | Get > | Dim values() As String = MyBase.Item(indexKey).Split(","c) > | Return values(indexValue) > | End Get > | End Property > | > | If I needed to index that way... > | > | -- > | Hope this helps > | Jay [MVP - Outlook] > | .NET Application Architect, Enthusiast, & Evangelist > | T.S. Bradley - http://www.tsbradley.net > | > | > | "Rich" <R***@discussions.microsoft.com> wrote in message > | news:441DE84C-DF14-41A4-954C-17A29548E9DE@microsoft.com... > || Thanks for your suggestion of the NameValueCollection. May I ask if you > || could share an example how it is used? > || > || As for keys, the first element in each row is unique so that could be a > | key. > || Else, I was just going to loop through the collection. But I tried > | writing > || a class with the 3 properties of the stuff I need to store. But I can't > || retrieve the values. The class effort is my 2nd post in this thread. > | Would > || you have any suggestions what I could do to the class to make it work? > || > || One other suggestion I got was to use a Hashtable with a structure. The > || also seems like a good idea. > || > || Rich > || > || "Jay B. Harlow [MVP - Outlook]" wrote: > || > || > Rich, > || > | I need to store some values in an array type collection object that > | can > || > | hold 3 or more parameters per index. > || > > || > It sounds like you want a collection of collections. Is the outer > | collection > || > keyed or not keyed? Is the inner collection keyed or not keyed? In > other > || > words is row one known by a specific Key or simply as row one? > || > > || > | would prefer not to hassel with a multi-dimensional > || > | array. > || > Rather then a 2 dimensional array, have you considered an array of > | arrays? > || > > || > Dim block(10,10) as String ' 2 dimensional array each row = 10, > each > || > column is 10 > || > > || > Dim jagged(10)() As String ' ragged/jagged array, 10 rows or 0 or > | more > || > elements. > || > > || > > || > Have you looked at the NameValueCollection? > || > > || > > | > http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemcollectionsspecializednamevaluecollectionclasstopic.asp > || > > || > It associates a String Key with one or more String values. If your > | values > || > and/or keys are not strings NameValueCollection probably won't work... > || > > || > | retrieve items > || > | s = obj.Item("parmA1", 1) > || > | t = obj.Item("parmA1", 2) > || > You may need to define a custom collection that encapsulates one of the > || > above for storage. > || > > || > -- > || > Hope this helps > || > Jay [MVP - Outlook] > || > ..NET Application Architect, Enthusiast, & Evangelist > || > T.S. Bradley - http://www.tsbradley.net > || > > || > > || > "Rich" <R***@discussions.microsoft.com> wrote in message > || > news:AB120169-40F6-449B-8768-7F6AA9469D6C@microsoft.com... > || > | Yes, I need to store some values in an array type collection object > | that > || > can > || > | hold 3 or more parameters per index. I have looked at the collection > || > object, > || > | hashtable object and would prefer not to hassel with a > | multi-dimensional > || > | array. Is there such an object in VB.Net? > || > | > || > | Dim obj As someCollectionObj > || > | obj.Add("parmA1", "parmA2", "parmA3") > || > | obj.Add("parmB1", "parmB2", "parmB3") > || > | ... > || > | > || > | retrieve items > || > | s = obj.Item("parmA1", 1) > || > | t = obj.Item("parmA1", 2) > || > | > || > | or, can a Hashtable contain a hashtable? > || > | > || > | Thanks, > || > | Rich > || > > || > > || > > | > | > > > But if I have:
| list.Add("parmA1", "parmA2", "parmA3") list.Add("parmC1")| list.Add("parmB1", "parmB2", "parmB3", "parmB4") The object returns: | parmA1: Notice there is no output for parmC1, as parmC1 has no values, so there is | item 0: parmA2 | item 1: parmA3 | parmB1: | item 0: parmB2 | item 1: parmB3 | item 2: parmB4 nothing to return. parmC1 is NOT placed into the collection. Is no output what you would expect for parmC1? If not, what is the expected output? -- Show quoteHide quoteHope this helps Jay [MVP - Outlook] ..NET Application Architect, Enthusiast, & Evangelist T.S. Bradley - http://www.tsbradley.net "Rich" <R***@discussions.microsoft.com> wrote in message System.Collections.Specialized.NameValueCollectionnews:4890CEFF-0991-47AA-AA0F-27281F3CD0CF@microsoft.com... | OK. I tried your class with these args | | | list.Add("parmA1", "parmA2", "parmA3") | list.Add("parmB1", "parmB2", "parmB3", "parmB4") | | The object returns | | parmA1: | item 0: parmA2 | item 1: parmA3 | parmB1: | item 0: parmB2 | item 1: parmB3 | item 2: parmB4 | | I don't see any problems. | | "Jay B. Harlow [MVP - Outlook]" wrote: | | > Doh! | > | Public Overloads Sub Add(ByVal key As String, ByVal ParamArray | > | values() As String) | > | For Each value As String In values | > | Add(key, value) | > | Next | > | End Sub | > The above code assumes that not passing any values is NOT a problem. which | > may or may not be a valid assumption. | > | > Is: | > | > list.Add("parmA1") | > | > Valid? | > | > | > | > -- | > Hope this helps | > Jay [MVP - Outlook] | > ..NET Application Architect, Enthusiast, & Evangelist | > T.S. Bradley - http://www.tsbradley.net | > | > | > "Jay B. Harlow [MVP - Outlook]" <Jay_Harlow_***@tsbradley.net> wrote in | > message news:%23dVjPosIGHA.1388@TK2MSFTNGP11.phx.gbl... | > || Thanks for your suggestion of the NameValueCollection. May I ask if you | > || could share an example how it is used? | > | | > | Dim list As New Show quoteHide quote | > | list.Add("parmA1", "parmA2") MyBase.Item(indexKey).Split(","c)| > | list.Add("parmA1", "parmA3") | > | list.Add("parmB1", "parmB2") | > | list.Add("parmB1", "parmB3") | > | | > | Dim a1 As String | > | Dim b1 As String | > | a1 = list.Item("parmA1") | > | b1 = list.Item("parmB1") | > | | > | Dim a1s() As String = list.Item("parmA1").Split(","c) | > | Dim b1s() As String = list.Item("parmB1").Split(","c) | > | | > | If you like you could encapsulate some of the logic into a custom version | > of | > | NameValueCollection that supported adding a list of values for a key & | > | returning one value for a key, something like: | > | | > | Public Class someCollectionObj | > | Inherits System.Collections.Specialized.NameValueCollection | > | | > | Public Overloads Sub Add(ByVal key As String, ByVal ParamArray | > | values() As String) | > | For Each value As String In values | > | Add(key, value) | > | Next | > | End Sub | > | | > | Default Public Overloads ReadOnly Property Item(ByVal key As | > String, | > | ByVal index As Integer) As String | > | Get | > | Dim values() As String = Item(key).Split(","c) | > | Return values(index) | > | End Get | > | End Property | > | | > | Public ReadOnly Property ItemCount(ByVal key As String) As Integer | > | Get | > | Return Item(key).Split(","c).Length | > | End Get | > | End Property | > | | > | End Class | > | | > | Then you could use the above, something like: | > | | > | Dim list As New someCollectionObj | > | list.Add("parmA1", "parmA2", "parmA3") | > | list.Add("parmB1", "parmB2", "parmB3", "parmB4") | > | | > | For Each key As String In list.Keys | > | Debug.WriteLine(Nothing, key) | > | Debug.Indent() | > | For index As Integer = 0 To list.ItemCount(key) - 1 | > | Debug.WriteLine(list.Item(key, index), "item " & index) | > | Next | > | Debug.Unindent() | > | Next | > | | > | I would consider adding an indexers like: | > | | > | Default Public Overloads ReadOnly Property Item(ByVal key As | > String) | > | As String() | > | Get | > | Return MyBase.Item(key).Split(","c) | > | End Get | > | End Property | > | | > | Default Public Overloads ReadOnly Property Item(ByVal index As | > | Integer) As String() | > | Get | > | Return MyBase.Item(index).Split(","c) | > | End Get | > | End Property | > | | > | Which return an array of strings for a key/index rather then the comma | > | delimited string. | > | | > | I might also consider an indexer something like: | > | | > | Default Public Overloads ReadOnly Property Item(ByVal indexKey As | > | Integer, ByVal indexValue As Integer) As String | > | Get | > | Dim values() As String = Show quoteHide quote | > | Return values(indexValue) http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemcollectionsspecializednamevaluecollectionclasstopic.asp| > | End Get | > | End Property | > | | > | If I needed to index that way... | > | | > | -- | > | Hope this helps | > | Jay [MVP - Outlook] | > | .NET Application Architect, Enthusiast, & Evangelist | > | T.S. Bradley - http://www.tsbradley.net | > | | > | | > | "Rich" <R***@discussions.microsoft.com> wrote in message | > | news:441DE84C-DF14-41A4-954C-17A29548E9DE@microsoft.com... | > || Thanks for your suggestion of the NameValueCollection. May I ask if you | > || could share an example how it is used? | > || | > || As for keys, the first element in each row is unique so that could be a | > | key. | > || Else, I was just going to loop through the collection. But I tried | > | writing | > || a class with the 3 properties of the stuff I need to store. But I can't | > || retrieve the values. The class effort is my 2nd post in this thread. | > | Would | > || you have any suggestions what I could do to the class to make it work? | > || | > || One other suggestion I got was to use a Hashtable with a structure. The | > || also seems like a good idea. | > || | > || Rich | > || | > || "Jay B. Harlow [MVP - Outlook]" wrote: | > || | > || > Rich, | > || > | I need to store some values in an array type collection object that | > | can | > || > | hold 3 or more parameters per index. | > || > | > || > It sounds like you want a collection of collections. Is the outer | > | collection | > || > keyed or not keyed? Is the inner collection keyed or not keyed? In | > other | > || > words is row one known by a specific Key or simply as row one? | > || > | > || > | would prefer not to hassel with a multi-dimensional | > || > | array. | > || > Rather then a 2 dimensional array, have you considered an array of | > | arrays? | > || > | > || > Dim block(10,10) as String ' 2 dimensional array each row = 10, | > each | > || > column is 10 | > || > | > || > Dim jagged(10)() As String ' ragged/jagged array, 10 rows or 0 or | > | more | > || > elements. | > || > | > || > | > || > Have you looked at the NameValueCollection? | > || > | > || > | > | | > Show quoteHide quote | > || > | > || > It associates a String Key with one or more String values. If your | > | values | > || > and/or keys are not strings NameValueCollection probably won't work... | > || > | > || > | retrieve items | > || > | s = obj.Item("parmA1", 1) | > || > | t = obj.Item("parmA1", 2) | > || > You may need to define a custom collection that encapsulates one of the | > || > above for storage. | > || > | > || > -- | > || > Hope this helps | > || > Jay [MVP - Outlook] | > || > ..NET Application Architect, Enthusiast, & Evangelist | > || > T.S. Bradley - http://www.tsbradley.net | > || > | > || > | > || > "Rich" <R***@discussions.microsoft.com> wrote in message | > || > news:AB120169-40F6-449B-8768-7F6AA9469D6C@microsoft.com... | > || > | Yes, I need to store some values in an array type collection object | > | that | > || > can | > || > | hold 3 or more parameters per index. I have looked at the collection | > || > object, | > || > | hashtable object and would prefer not to hassel with a | > | multi-dimensional | > || > | array. Is there such an object in VB.Net? | > || > | | > || > | Dim obj As someCollectionObj | > || > | obj.Add("parmA1", "parmA2", "parmA3") | > || > | obj.Add("parmB1", "parmB2", "parmB3") | > || > | ... | > || > | | > || > | retrieve items | > || > | s = obj.Item("parmA1", 1) | > || > | t = obj.Item("parmA1", 2) | > || > | | > || > | or, can a Hashtable contain a hashtable? | > || > | | > || > | Thanks, | > || > | Rich | > || > | > || > | > || > | > | | > | | > | > | > > Yes, I need to store some values in an array type collection object that Below is a rough draft of class HashTableStringArray. It uses a hashtable. can > hold 3 or more parameters per index. I have looked at the collection object, > hashtable object and would prefer not to hassel with a multi-dimensional > array. Is there such an object in VB.Net? The key is a string, and the item stored for each key is an array of strings. A brief test procedure is at the bottom. For each key string, your store multiple values. For each key, you can retrieve all values or one value by its zero based index. Public Class HashTableStringArray Public ht As New Hashtable ' Key-Item pairs where each Item is an array of strings Public Sub Add(ByVal Key As String, ByVal ParamArray Item() As String) ' if Key is found, replace Item with Data, otherwise add Key and Item If ht.Contains(Key) Then ht.Item(Key) = Item Else ht.Add(Key, Item) End If End Sub Public Sub Remove(ByVal Key As String) ' if Key is found, remove it, otherwise no operation If ht.Contains(Key) Then ht.Remove(Key) End Sub Public Function FetchArray(ByVal Key As String) As String() ' if Key is found, return its string array, otherwise return nothing If ht.Contains(Key) Then Return CType(ht.Item(Key), String()) Else Return Nothing End If End Function Public Function FetchIndex(ByVal Key As String, ByVal Index As Integer) As String ' if Key is found and Index is in bounds, return Index'th string, otherwise return "" Dim a() As String = FetchArray(Key) If a Is Nothing Then Return "" ElseIf Index < LBound(a) Or Index > UBound(a) Then Return "" Else Return a(Index) End If End Function Public Shared Sub Test() ' test Dim zz As New HashTableStringArray zz.Add("aaa", "x0", "x1") zz.Add("bbb", "y0", "y1", "y2") Dim s As String s = zz.FetchIndex("aaa", 1) ' s="x1" s = zz.FetchIndex("bbb", 6) ' s="" s = zz.FetchIndex("bbb", 2) ' s="y2" s = zz.FetchIndex("ccc", 1) ' s="" s = "" End Sub End Class Thanks all for your examples. Very cool.
Show quoteHide quote "Rich" wrote: > Yes, I need to store some values in an array type collection object that can > hold 3 or more parameters per index. I have looked at the collection object, > hashtable object and would prefer not to hassel with a multi-dimensional > array. Is there such an object in VB.Net? > > Dim obj As someCollectionObj > obj.Add("parmA1", "parmA2", "parmA3") > obj.Add("parmB1", "parmB2", "parmB3") > ... > > retrieve items > s = obj.Item("parmA1", 1) > t = obj.Item("parmA1", 2) > > or, can a Hashtable contain a hashtable? > > Thanks, > Rich
C# to VB.net conversion for "?" conditionals
ANN: Free PDF books for registered users of Visual Studio 2005 Batch update to table from datagrid Cascading list boxes currency manager Waiting for a shell command What am I missing?? Column names in Dataset Creating a dynamic array in VB NET Static linking to unmanaged library |
|||||||||||||||||||||||