문제

열거되고있는 컬렉션이 "Foreach"진술 내에서 수정할 수 없다는 것을 알게되었습니다.

"수집이 수정되었습니다. 열거 작업은 실행되지 않을 수 있습니다."

이제 제가 생각한 솔루션은 사전 키가 포함 된 동일한 크기의 더미 컬렉션을 만들고 문제의 수집을 수정하기 위해 열거하는 것입니다.

    private void InvalidateAuthenticatedNodes()
    {
        var dummy = new Dictionary<int, bool>(_AuthenticatedNodes.Count);
        foreach (var nodeId in _AuthenticatedNodes.Keys)
            dummy[nodeId] = false;

        foreach (var nodeId in dummy.Keys)
            _AuthenticatedNodes[nodeId] = false;

        ClearAuthenticatedDateTime();
    }

위의 코드는 잘 작동했습니다. 나는 funcc delegate를 사용하여 다음과 같이 키의 사본을 반환하기 위해 위의 코드를 리팩토링하는 과정에있었습니다.

    private void InvalidateAuthenticatedNodes()
    {
        var getNodeIds = 
            new Func<Dictionary<int, bool>, IEnumerable<int>>(
                nodes => nodes.Select(node => node.Key));
        foreach (var nodeId in getNodeIds(_AuthenticatedNodes))
        {
            _AuthenticatedNodes[nodeId] = false;
        }

        ClearAuthenticatedDateTime();
    }

내가 기대했던 것과는 달리 getnodeids 사본을 반환하지 않습니다. 대신 사본을 반환하는 방법이 있습니까?

*편집하다: 전에 임시 결과 Jaredpar의 대답

Jaredpar의 대답과 비슷하지만 그의는 더 간결했고 나는 그의 대답을 가지고 갔다. 그러나 여기에 내가 공유하기 위해 제기 한 비슷한 결과가 있습니다.

    private void InvalidateAuthenticatedNodes()
    {
        var getNodeIds = 
            new Func<Dictionary<int, bool>, IEnumerable<int>>(nodes => 
                nodes.Select(node => node.Key));
        foreach (var nodeId in getNodeIds(_AuthenticatedNodes).ToList())
        {
            _AuthenticatedNodes[nodeId] = false;
        }

        ClearAuthenticatedDateTime();
    }

*편집하다: 최종 결과 (정제)

_AuthenticatedNodes.Keys.ToList().ForEach(
    nodeId => _AuthenticatedNodes[nodeId] = false);
도움이 되었습니까?

해결책

컬렉션 끝에 .tolist ()를 추가하면 목록의 전체 사본을 자동으로 반환합니다.

foreach (var nodeId in _AuthenticatedNodes.Keys.ToList())
    ...

다른 팁

Foreach를 사용하는 대신 일반을 사용할 수 있습니다. 그러나 항목을 추가/제거 할 때주의하면 컬렉션 내부의 요소의 인덱스가 변경됩니다.

열거 가능한 클래스를 변경하면 원래 열거자가 유효하지 않아 사본을 만들고 수정해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top