func 에서 원본 목록 의 사본을 어떻게 반환합니까?
문제
열거되고있는 컬렉션이 "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를 사용하는 대신 일반을 사용할 수 있습니다. 그러나 항목을 추가/제거 할 때주의하면 컬렉션 내부의 요소의 인덱스가 변경됩니다.
열거 가능한 클래스를 변경하면 원래 열거자가 유효하지 않아 사본을 만들고 수정해야합니다.
제휴하지 않습니다 StackOverflow