Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsFree MagazinesWhite PapersSubmit Content
Discussion GroupsASP.NETWindows FormsLanguages.NET FrameworkVisual Studio.NET
Articles.NET FrameworkASP.NETToolsWindows Forms
.NET DirectoryOpen Source ProjectsUser GroupsWeb Resources
Related Topics
Visual Basic 6SQL ServerMS AccessOther DB ProductsMS Server ProductsMore Topics ...

.NET Forum / Languages / C# / December 2005

Tip: Looking for answers? Try searching our database.

iterating through a collection containing different types of numeric values and adding a specified number to the values.

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Anders Würtz - 15 Dec 2005 19:38 GMT
i have an assignment to iterate through a collection containing
different types of numeric values (float, double, int, byte, short etc.)
and to add 1 to all of them. I tried with array and arraylist so far,
but i either get a cast exception or the value doesn't seem to get
updated at all. What should i be doing to make it work?   

Thanks in advance

Anders
MuZZy - 15 Dec 2005 19:59 GMT
> i have an assignment to iterate through a collection containing
> different types of numeric values (float, double, int, byte, short etc.)
[quoted text clipped - 5 lines]
>
> Anders

try this:

ArrayList al = new ArrayList();
al.Add((int)5);
al.Add((double)7.89);
al.Add((short)12);

foreach (object o in al)
{
    if (o is int)
        o = ((int)o)++;
    else if (o is double)
        o = ((double)o)++
<...etc...>
}

Hope it helps
MuZZy
Anders Würtz - 15 Dec 2005 20:28 GMT
>> i have an assignment to iterate through a collection containing
>> different types of numeric values (float, double, int, byte, short etc.)
[quoted text clipped - 23 lines]
> Hope it helps
> MuZZy

private ArrayList data;

            ......

            this.byteField = 2;
            this.shortField = 2;
            this.intField = 2;
            this.longField = 2;
            this.sbyteField = 2;
            this.ushortField = 2;
            this.uintField = 2;
            this.ulongField = 2;
            this.floatField = 2;
            this.doubleField = 2;
            this.decimalField = 2;

            data = new ArrayList();
            data.Add(this.byteField);
            data.Add(this.shortField);
            data.Add(this.intField);
            data.Add(this.longField);
            data.Add(this.sbyteField);
            data.Add(this.ushortField);
            data.Add(this.uintField);
            data.Add(this.ulongField);
            data.Add(this.floatField);
            data.Add(this.doubleField);
            data.Add(this.decimalField);
            ....

            in a method...

            ....

            foreach (object o in data)
            {
                if (o is byte)
                    o = ((byte)o)++;
                else if (o is double)
                    o = ((short)o)++;
                else if (o is int)
                    o = ((int)o)++;
                else if (o is long)
                    o = ((long)o)++;
                else if (o is sbyte)
                    o = ((sbyte)o)++;
                else if (o is ushort)
                    o = ((ushort)o)++;
                else if (o is uint)
                    o = ((uint)o)++;
                else if (o is ulong)
                    o = ((ulong)o)++;
                else if (o is float)
                    o = ((float)o)++;
                else if (o is double)
                    o = ((double)o)++;
                else if (o is decimal)
                    o = ((decimal)o)++;
            }

            compiler errors:

            1. cannot assign to 'o' because it is read-only
            2. The left-hand side of an assignment must be a
     variable, property or indexer

how do i solve this so 1 is added to all the values?

thanks in advance

Anders
Matt - 15 Dec 2005 20:06 GMT
> i have an assignment to iterate through a collection containing
> different types of numeric values (float, double, int, byte, short etc.)
[quoted text clipped - 3 lines]
>
> Thanks in advance

There are lots of ways to do this, I'm not sure what they are teaching
you at present. If you *know* each one of them is a value type, you can
just convert them all to a given super-type (like double) and add to
them.
Otherwise, you could do something like this:

ArrayList a = new ArrayList();
int i = 1;
float f = 2.0f;
double d = 3.0;
byte b = 4;
string s = "hello";

// Add some data to the array.
a.Add( i );
a.Add( f );
a.Add( d );
a.Add( b );
a.Add( s );

// Print them out to show
foreach ( object o in a )
  Console.Out.WriteLine("value: {0}", o );

// Increment those we can increment.
for ( int o=0; o<a.Count; ++o )
{
  // Can't convert non-value types
  if ( a[o].GetType().IsValueType )
  {
     // Make it a double
     double d1 = (double)Convert.ChangeType( a[o], d.GetType() );
     // Increment it
     d1 += 1.0;
     // Make it what it was.
     object obj = Convert.ChangeType( d1, a[o].GetType() );
     // And store it back in the array
     a[o] = obj;
  }
}

// Print them out to show
foreach ( object o in a )
  Console.Out.WriteLine("value: {0}", o );

This isn't pretty and it isn't elegant. But it should get you started.

Matt
Anders Würtz - 15 Dec 2005 20:20 GMT
> i have an assignment to iterate through a collection containing
> different types of numeric values (float, double, int, byte, short etc.)
[quoted text clipped - 5 lines]
>
> Anders       
            private ArrayList data;

            ......

            this.byteField = 2;
            this.shortField = 2;
            this.intField = 2;
            this.longField = 2;
            this.sbyteField = 2;
            this.ushortField = 2;
            this.uintField = 2;
            this.ulongField = 2;
            this.floatField = 2;
            this.doubleField = 2;
            this.decimalField = 2;

            data = new ArrayList();
            data.Add(this.byteField);
            data.Add(this.shortField);
            data.Add(this.intField);
            data.Add(this.longField);
            data.Add(this.sbyteField);
            data.Add(this.ushortField);
            data.Add(this.uintField);
            data.Add(this.ulongField);
            data.Add(this.floatField);
            data.Add(this.doubleField);
            data.Add(this.decimalField);
            ....
           
            in a method...
           
            ....

            foreach (object o in data)
            {
                if (o is byte)
                    o = ((byte)o)++;
                else if (o is double)
                    o = ((short)o)++;
                else if (o is int)
                    o = ((int)o)++;
                else if (o is long)
                    o = ((long)o)++;
                else if (o is sbyte)
                    o = ((sbyte)o)++;
                else if (o is ushort)
                    o = ((ushort)o)++;
                else if (o is uint)
                    o = ((uint)o)++;
                else if (o is ulong)
                    o = ((ulong)o)++;
                else if (o is float)
                    o = ((float)o)++;
                else if (o is double)
                    o = ((double)o)++;
                else if (o is decimal)
                    o = ((decimal)o)++;
            }

            compiler errors:
           
            1. cannot assign to 'o' because it is read-only
            2. The left-hand side of an assignment must be a               variable,
property or indexer

how do i solve this so 1 is added to all the values?

thanks in advance

Anders
Matt - 15 Dec 2005 20:31 GMT
> > i have an assignment to iterate through a collection containing
> > different types of numeric values (float, double, int, byte, short etc.)
[quoted text clipped - 43 lines]
>                 if (o is byte)
>                     o = ((byte)o)++;

Nope, can't do that.  The object itself isn't modifiable.
You'd have to do something like this:

            ArrayList data = new ArrayList();
            data.Add(byteField);
            data.Add(shortField);
            data.Add(intField);

            for (int i=0; i<data.Count; ++i )
            {
                object o = data[i];
                if (o is byte)
                {
                    byte b = (byte)o;
                    b++;
                    data[i] = b;
                }
            }

Matt
Saurabh Sharma - 27 Dec 2005 14:42 GMT
foreach is a readonly implementation you cannot change the object.
Just use for loop it will work fine

Saurabh

Anders Würtz wrote:
> > i have an assignment to iterate through a collection containing
> > different types of numeric values (float, double, int, byte, short etc.)
[quoted text clipped - 43 lines]
> if (o is byte)
> o = ((byte)o)++;

Nope, can't do that.  The object itself isn't modifiable.
You'd have to do something like this:

 ArrayList data = new ArrayList();
 data.Add(byteField);
 data.Add(shortField);
 data.Add(intField);

 for (int i=0; i<data.Count; ++i )
 {
object o = data[i];
if (o is byte)
{
byte b = (byte)o;
b++;
data[i] = b;
}
 }

Matt

Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.