2010-03-12 2 views
1

컬렉션에서 요소 (값)를 수정하는 이러한 문제에 대한 패턴 (모범 사례)은 무엇입니까?C#에서 컬렉션을 수정하기위한 패턴은 무엇입니까

조건 :

  • 수정이

    컬렉션의
    • 크기가 변경되지 않는다 (어떤 요소가 삭제되지 않거나 추가) 현재 위치에서
    • 쉽고 좋은했다 ++ C에서

    , I 그냥 물마루를 반복 수집하고 요소를 변경했습니다. 하지만 C# iterating (열거자를 사용하여) 읽기 전용 작업 (C++의 측면에서 말하는 const_iterator 사용할 수 있습니다)입니다.

    그래서 C#에서이 작업을 수행하는 방법은 무엇입니까?

    예제의 서열을 갖는,도 4는 3, 2, 1 ''1,2,3,4 '변형이 변경되는 "1, 2, 8, 9"가 아니라 "1, 2, 3'또는 , 5 ".

  • +0

    관련 질문 http://stackoverflow.com/questions/1538301 –

    답변

    5

    일반적으로 대신 인덱스로 갈 것 :

    for (int i = 0; i < foo.Length; i++) 
    { 
        if (ShouldChange(foo[i])) 
        { 
         foo[i] = GetNewValue(i); 
        } 
    } 
    

    더 기능적인 대안은 "수정"원하는 데이터가 포함 된 새로운 컬렉션을 반환하는 방법을 만드는 것입니다 - 그것은 모두에 따라 달라집니다 너는하고 싶다.

    +0

    그래서 C++은 더 유연합니다. 답변 해 주셔서 감사합니다. – greenoldman

    1

    실제로 달라집니다. readonly 부분은 iterator 자체에 적용됩니다. 객체 컬렉션을 반복하는 경우 참조를 통해 객체의 상태를 변경할 수 있습니다. 값 형식의 컬렉션

    , 당신은 반복하는 동안 요소를 변경할 수 있지만, 경우에 당신은 정기적 루프 인덱서를 사용하여 요소를 실행할 수 있습니다.

    +0

    고맙습니다. 첫 번째 문장은 부분적으로 만 사실입니다. 요소가 불변인지 아닌지 미리 알 수 없습니다. 클래스의 경우 컬렉션은 참조 컬렉션입니다. 이렇게하면 참조를 변경해야합니다. 그리고 열거자는 이것을 할 수 없습니다. – greenoldman

    +0

    @macias : 반복 변수는 항상 읽기 전용입니다. 그러나 참조 인 경우 참조하는 인스턴스를 수정할 수는 있지만 참조 자체는 변경할 수 없습니다. 귀하의 질문에 대한 내 의견에 링크를 참조하십시오. –

    +0

    나는 완전히 이해한다 - 나의 질문은 그것 (루프)이 더 잘 보이는 방법이었다. C++에서는 정말 멋지 기 때문에 C#에서는보기 흉한 것처럼 보입니다. 그게 다야. – greenoldman

    관련 문제