views:

329

answers:

3

I tend to use ArrayLists of structures. It is then very easy to cycle through the list with a foreach.

The problem I have is I cant use a foreach to modify the structures contents and have to use a for and messy typecasts.

((dataStructure)files[x]).name = here;

Is there a tidier way to do it?

+13  A: 

Yes, there is: don't use an untyped ArrayList, these types are deprecated in favour of the generic types in System.Collections.Generic. In your case: List<T>.

You still can't use it in conjunction with a foreach loop to modify structure values but at least you don't have to cast.

Konrad Rudolph
Lists do look like a much better idea
Tim
If you're stuck with your ArrayLists for some reason (they get returned by some API that you don't have control over) then use the Cast<T> extension method for ArrayList to convert them into an IEnumerable<T>. IEnumerable<Foo> foo = foo1.Cast<Foo>();
Martin Peck
+6  A: 

I know this sounds simplistic but just say no to mutable value types.

They're almost never the right solution to the problem. There are a very few exceptions, but classes are almost always the way to go.

In addition, if you're really using an ArrayList then you'll be incurring an unboxing cost already... (As Konrad says, if you can use .NET 2.0 then use generics.)

If you really insist on using mutable structures, then use a for loop instead of foreach. But please, please change to classes anyway.

Jon Skeet
Jon... I think you should just put a disclaimer in every post you write about mutable types :D
Jorge Córdoba
i need to store various details of all the hosts that i have discovered and i need to be able to cycle through and modify them. how shoudl i be doing this?
Tim
Use a class instead of a struct.
Jon Skeet
and have a list of classes?
Tim
Have a list of instances of the class.
Jon Skeet
I'll start doing that then. I assumed structs werent that different to classes as they seem pretty similar.
Tim
No, they behave very differently. I *strongly* recommend that you get a good beginner's guide to C# - you'll run into some really weird problems before you understand value types vs reference types.
Jon Skeet
Ive got a c# book which ive read most of. I didnt mean that they are the same as clearly they are not. They appear similar as they can both have variables and methods. Ive come from an embedded c background where you store data in structs, so you can see how it might feel a bit strange to be storing data in classes
Tim
What I'm saying is that the difference is really, really important. Try to forget you ever knew C :)
Jon Skeet
I would love to forget C, but I still write embedded code!
Tim
A: 

Use the generic version of ArrayList: List<DataStructure>.

This way things look a lot better:

files[x].name = here;
bruno conde