문제

다음 스 니펫부터 시작하겠습니다.

Foreach(Record item in RecordList){
  ..
  item = UpdateRecord(item, 5);
  ..
}

UpdaterEcode 함수는 항목의 일부 필드를 변경하고 변경된 개체를 반환합니다. 이 경우 컴파일러는 항목을 Foreach 반복으로 업데이트 할 수 없다는 예외를 던졌습니다.

이제 updateRecord 메소드가 변경되어 무효화되면 스 니펫이 다음과 같습니다.

Foreach(Record item in RecordList){
  ..
  UpdateRecord(item, 5);
  ..
}

이 경우 레코드가 참조 유형이므로 항목이 업데이트됩니다. 그러나 코드를 읽을 수 없게 만듭니다.

내가 작업하고있는 프로젝트에는 거의 동일한 코드를 반복하는 많은 foreach-loops가 있으므로 레코드의 일부를 업데이트하는 메소드를 만들고 싶습니다. 이것을하는 좋은 방법이 있습니까? 코드를 더 많이 버리는 대신 코드를 더 읽기 쉽게 만드는 것입니까?

도움이 되었습니까?

해결책

컬렉션을 업데이트 해야하는 경우 반복자 패턴을 사용하지 마십시오. 오류가 발생하거나 나쁜 냄새가납니다.

이 상황에서 인덱스가있는 루프를 사용하는 것이 조금 더 명확하다는 것을 알았습니다.

다른 팁

컴파일러는 업데이트 할 수 없다고 불평합니다 수집, 기록이 아닙니다. item = updateEcord를 수행하면 반복자 변수 항목을 재 할당합니다.

나는 UpdateRecord (항목, 5)가 어떤 식 으로든 읽을 수 없다고 동의하지 않지만, 기분이 나아지면 확장 방법으로 인해 항목의 내용을 변경하고 있음을 더 명확하게 할 수 있습니다.

static void Update(this Record item, int value) {
   // do logic
}

foreach (Record item in RecordList) {
   item.Update(5);
}

동일한 목록을 업데이트해야합니까? 대신 새 (업데이트 된) 열거를 반환 할 수 있습니까?

foreach(Record item in RecordList){
  ..
  yield return GetUpdatedRecord(item, 5);
  ..
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top