2011-04-21 2 views
1

ObservableCollection을 다른 클래스 (동일한 클래스를 기반으로 함)에서 업데이트하는 것이 다음과 같은 방법입니까, 아니면 다른 방법으로 수행하는 것이 더 좋을까요?다른 컬렉션에서 컬렉션을 효율적으로 업데이트하는 방법

foreach (MyEntity c in collection2) 
    { 
     collection1.Where(p => p.EntID == c.EntID).FirstOrDefault().Field1 = c.Field1; 
     collection1.Where(p => p.EntID == c.EntID).FirstOrDefault().Field2 = c.Field2; 
     ... 
     collection1.Where(p => p.EntID == c.EntID).FirstOrDefault().FieldN = c.FieldN;   
    } 

EntID이 기본 키입니다.
(충분히 좋으면 나는 빠르고 효율적이다).

+0

collection2에 새로 추가 된 항목을 collection1에 추가해야합니까? 컬렉션 2에 없지만 콜렉션 1에있는 아이템을 제거하는 것은 어떻습니까? 이는 솔루션을 조금 복잡하게 만들지 만 그다지 어렵지는 않습니다. – captncraig

+0

@CMP 감사합니다. 예, 결국 제가 언급 한 모든 것을해야합니다. 단지 접근법의 본질을 이해하기 위해 예제를 더 간단하게 만들고 싶었습니다. – rem

답변

3
var myItem = collection1.Where(p => p.EntID == c.EntID).FirstOrDefault(); 
    if (myItem == null) 
     continue; 
    myItem.Field1 = c.Field1; 
    myItem.Field2 = c.Field2; 
    ... 
    myItem.FieldN = c.FieldN; 

myItemc 다른 유형의 경우는, AutoMapper를 보라.

+0

훨씬 더 멋지게 보이고 모든 속성에 대한 항목을 검색하지 않아도 저장됩니다. null 체크는 또한 잠재적 인 충돌 버그를 피합니다. – captncraig

2

리플렉션을 사용하여 한 필드에서 다른 필드로 N 필드를 복사 할 수 있습니다. 나는 이것에 대해 이미 여기에서 말했습니다 : How to refactor this?.

당신은 당신의 클래스 (SomeClass)이이 코드 (두 객체가 같은 클래스이다)를 구현 할 수 있습니다

: 클래스에 새로운 속성이있는 경우

public void CopyPropertiesFrom(SomeClass SourceInstance) 
{ 
    foreach (PropertyInfo prop in typeof(SomeClass).GetProperties()) 
     prop.SetValue(this, prop.GetValue(SourceInstance, null), null); 
} 

그 방법을, 당신은을 업데이트 귀찮게 할 필요가 없습니다 코드, 이미 있습니다!

다른 클래스의 객체의 경우 속성 이름을 리플렉션 할 수도 있지만 속성이없는 경우, 다른 유형의 속성, 속성 값이 null 인 경우, etc.)

+0

Ew. 반사는 값이 비쌉니다. –

+0

예, 그렇습니다. 그리고 지혜와 함께 사용해야합니다. 그가 10000 개의 객체를 복사한다면, 그것은 지각 할 수 없습니다 (1-2 ms 더). 1000의 경우 약 30-40ms 정도 소요됩니다. 10.000, 300-350 ms 더 많은 눈썹이 생깁니다. 그것은 단지 100.000 이상의 악취를 시작합니다. 따라서 신중하게 사용하십시오. Obs .: 벤치 마크 앱의 데이터입니다. –

관련 문제