2014-06-21 2 views
0

ACTIVITY 클래스가 있습니다. 이 클래스에는 랩 목록이 포함되어 있으며 각 랩에는 TRACPOINTS 컬렉션이 있습니다.LINQ 많이 선택 - 병합 된 컬렉션 수정

ACTIVITY --many -> LAPS --- many -> TRACPOINTS.

TRACPOINTS 컬렉션을 채울 때마다 모든 TRACPOINTS 목록이 표시됩니다. 하지만 물론 원본을 수정하면 원본이 수정 된 이후에 수정되지 않습니다.

평평한 tracpoints에 대한 변경 사항이 각 무릎의 Tracpoints 목록에서 변경되는 방식이 있습니까?

+3

이유는 무엇입니까? 'Tracpoint'는'struct'입니까? –

+2

몇 가지 코드를 넣을 수 있습니다. –

+3

_ "원본이므로 사본이 수정되지 않습니다."_ 반드시 그래야 할 필요는 없지만, 코드를 볼 때까지 확신 할 수는 없습니다. 컬렉션. –

답변

1

TRACPOINT가 구조체 인 한 합리적으로는 불가능합니다.

struct variable 또는 field의 값을 다른 변수 나 필드에 할당 할 때마다 그 내용이 복사됩니다. 메서드 인수로 전달하거나 메서드에서 반환하는 경우에도 값이 복사됩니다. 이것은 가치 의미론 [1]입니다. 이 값의 의미를 가지고있는 int 같은 원자 유형과 비교해보십시오. 당신은 아마 때문에, 다음 코드는 SelectMany을 할 경우, 컬렉션에서 각 값이 아마 임시 로컬 변수에 할당 한 다음 반복자 (SelectMany)에서 반환 된 3

static function Change(int j) { j = 3; } 
static void Main(string[] args) { 
    int i = 2; 
    Change(i); 
    System.Console.WriteLine(i); 
} 

, 2를 인쇄하지 기대 iterator에서 나올 때까지 복사되고 실제로 복사 될 가능성이 큽니다. 그래서 당신이 업데이트하는 것은 구조체의 복사본입니다. 이 예에서와 마찬가지로 변수 i은 변경하지 않지만 변수는 j에 저장됩니다.

이 때문에 struct가 변경 불가능해야합니다. 구조체에 getter 및 setter 속성이있는 대신 getter 만 있어야합니다. 구조체의 속성 값을 변경하려면 원본 구조체 전체를 복사하고 원하는 속성 값을 변경하고 새 구조체 인스턴스를 반환하는 메서드를 구현할 수 있습니다. 실제로, 다시, 그것의 사본은 돌려 보내질 것이다. 예 :

, 당신이 포인터와 안전하지 않은 C#을 사용하여 원하는,하지만 대신 참조 의미를 가질 수 있도록, 나,이 클래스에 구조체를 변경하는 방법이 쉬울 것입니다 믿는 것을 달성 할 수있을 것이라고 말했다
struct S { 
    int f; 
    public int F { get { return this.f; } } 
    public S SetF(int newVal) { 
     var s = new S(); 
     s.f = newVal; 
     return s; 
    } 
} 

var x = new S(); 
x = x.SetF(30); 

가치 의미의, 또는 구조체를 유지하지만 불변하게하고 Linq를 사용하지 않는, 오래된 학교 루프. 당신이 그런 시나리오에서 SelectMany 같은 뭔가 Linq에 사용하려는 경우, 당신은 아마 ... 구조체와 너무 많은 클래스 사이의 성능 차이에 대해 걱정하지 않는다

[1] http://msdn.microsoft.com/en-us/library/aa664472(v=vs.71).aspx