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