iterating through a collection containing different types of numericvalues and adding a specified nu

  • Thread starter Thread starter =?ISO-8859-1?Q?Anders_W=FCrtz?=
  • Start date Start date
?

=?ISO-8859-1?Q?Anders_W=FCrtz?=

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
 
Anders said:
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

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 said:
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

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 said:
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
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
 
MuZZy said:
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

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
 
Anders said:
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)++;

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;
if (o is byte)
{
byte b = (byte)o;
b++;
data = b;
}
}


Matt
 
foreach is a readonly implementation you cannot change the object.
Just use for loop it will work fine

Saurabh
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)++;

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;
if (o is byte)
{
byte b = (byte)o;
b++;
data = b;
}
}


Matt
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Back
Top