문제
나는에 대해 많이 알고 있 C#그러나 이것은 연설을 저와 Google 는 도움이 되지 않습니다.
나페 범위의 객체입니다.나는 설정하려 속에 첫 번째 하나입니다.나는 그렇게,하지만 내가 열거를 통해 개체 범위 수정,보이지 않 변경합니다.
여기에는 좋은 문제의 예:
public static void GenericCollectionModifier()
{
// 1, 2, 3, 4... 10
var range = Enumerable.Range(1, 10);
// Convert range into SubItem classes
var items = range.Select(i => new SubItem() {Name = "foo", MagicNumber = i});
Write(items); // Expect to output 1,2,3,4,5,6,7,8,9,10
// Make a change
items.First().MagicNumber = 42;
Write(items); // Expect to output 42,2,3,4,5,6,7,8,9,10
// Actual output: 1,2,3,4,5,6,7,8,9,10
}
public static void Write(IEnumerable<SubItem> items)
{
Console.WriteLine(string.Join(", ", items.Select(item => item.MagicNumber.ToString()).ToArray()));
}
public class SubItem
{
public string Name;
public int MagicNumber;
}
어떤 측면의 C#정"MagicNumber=42"에서 변화되는 출력을 말합니다.이 있을 수 있는 방법을 내는 변경하여""지팡이 하지 않고 어린이로 변환하 목록<>또는 배열?
감사합니다!-마이크
해결책
를 호출할 때 처음()열거 이상의 결과를 이 조의 코드:
Select(i => new SubItem() {Name = "foo", MagicNumber = i});
참고 하는 선택입니다 열거자는 의미,그것은 단지 선택하신 경우 항목이 그것에서(그리고 그것은 모 시간을 묻는다).결과는 어디에도 저장되지 않습니다,그래서 전화할 때 항목입니다.처음()신 새로운 SubItem
인스턴스입니다.할 때 다음 항목을 작성,그것은 무리의 새로운 SubItem
인스턴스-지 않는 한 당신이 가기 전에.
을 저장하려는 경우의 결과를 선택하고 수정하는것,당신이해야 할 뭔가가 다음과 같:
var items = range.Select(i => new SubItem() {Name = "foo", MagicNumber = i}).ToList();
다른 팁
내가 의심 뭔가를 배경에 있습니다.가장 가능성이 사실로 인해 IEnumerables 수 있습만 반복하면.
그것은 작동하는 경우 추가'ToList()'호출한 후 Select()할당할 때을'항목이'?
네트워크가 필요하지 않습니다 생각하는 항목입니다.처음()이용권 사본 의 하위 항목하는 대신 참조할 때,그래서 당신이 설정 변경되지 않를 통해 수행됩니다.
나는 가정하는 뭔가가 있으로 진행할 수있는 반복되면.할 수 있습을 변경하십시오 this:
// Convert range into SubItem classes
var items = range.Select(i => new SubItem() {Name = "foo", MagicNumber = i});
하기
// Convert range into SubItem classes
var items = range.Select(i => new SubItem() {Name = "foo", MagicNumber = i}).ToList();
고 있는 경우에는 다른 결과입니다.
할 수 없/지 않을 수정하는 컬렉션을 통해거움을 누리고 있다고 말한다.놀랐어요 이를 버리지 않는 예외입니다.
.처음()메서드,되지 않을 제공합니다.그것은 반환하는 새로운 개체의 인스턴스에서 첫 번째 위치의 당신의 열거.