2009-05-14 5 views
1

구조체의 ArrayList를 사용하는 경향이 있습니다. foreach를 사용하여 목록을 순환하는 것은 매우 쉽습니다.foreach의 내용 수정

문제는 구조 내용을 수정하기 위해 foreach를 사용할 수없고 for 및 지저분한 typecasts를 사용해야한다는 것입니다.

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

깔끔한 방법이 있습니까?

답변

7

나는이 단순한 소리를 알고 있지만 just say no to mutable value types.

그들은 거의 입니다. 문제에 대한 올바른 해결책입니다. 매우 몇 가지 예외가 있지만, 클래스는 거의 입니다. 이동 방법은 항상입니다. 또한

, 당신은 정말 (콘라드는 말한다 당신이 다음 .NET 2.0을 사용 제네릭을 사용할 수있는 경우.) 당신이 ... 이미 언 박싱 비용을 들이지됩니다

하면 다음 ArrayList을 사용하는 경우 당신은 정말로 가변 구조물을 사용하려고하고 foreach 대신에 for 루프를 사용하십시오. 하지만 제발, 어쨌든 수업으로 바꾸어주세요.

+0

Jon ... 나는 당신이 변경 가능한 타입에 관해 쓰는 모든 게시물에 면책 조항을 넣어야한다고 생각한다 : D –

+0

나는 발견 한 모든 호스트의 다양한 세부 사항을 저장해야하며주기를 거쳐 수정할 수 있어야한다. . 내가 어떻게 이러는거야? – Tim

+0

구조체 대신 클래스를 사용하십시오. –

13

예 : 형식이 지정되지 않은 ArrayList을 사용하지 않습니다. 이러한 유형은 System.Collections.Generic의 제네릭 형식이 사용되지 않습니다. 귀하의 경우 : List<T>.

구조 값을 수정하기 위해 루프를 foreach 루프와 함께 사용할 수는 없지만 적어도 캐스팅 할 필요는 없습니다.

+0

목록이 훨씬 더 좋은 생각 – Tim

+0

처럼 않는 대신 foreach, 당신은 동안 루프를 사용한다 그런 다음 ArrayList에 대한 캐스트 확장 메서드를 사용하여 IEnumerable 으로 변환합니다. IEnumerable foo = foo1.Cast (); –

1

일반 버전 ArrayList : List<DataStructure>을 사용하십시오.

이 방법

은 일이 더 많이 찾습니다 List <T>도 유용하지입니다

files[x].name = here; 
0

예, 경우가 있습니다. 이 경우 매뉴얼에서 가장 오래된 트릭이 작동합니다. 당신이 어떤 이유로 당신의 ArrayLists (그들은 당신이 제어 할 수없는 몇 가지 API에 의해 반환받을 붙어있는 경우

while (listItem.Count >0) 
{ 
//do operation with 0th element of List Item always like 
deletefunc(lisItem[0]); 
}