2010-03-07 5 views
21

Excel에서 비정규화된 레코드 집합을로드하는 상황이 있습니다. 각 행을 하나씩 끌어 와서 한 번에 하나씩 개체를 만듭니다. 각 행에는 회사 및/또는 클라이언트가 포함될 수 있습니다.C#은 런타임에 두 개체를 병합합니다.

내 문제는 여러 행에 동일한 개체가있을 수 있으므로 이미 작성했을 수 있습니다. 나는 그것이 이미 목록에 있는지보기 위해 비교를합니다. 그렇다면 두 번째 행에서 새로운 정보를 얻지 못하게하기 위해 두 객체를 병합해야합니다.

그렇게 :

company - client - address - phone 
---------------------------------------- 
mycompany -   - myaddress - 
mycompnay - myclient -   - myphone 

그래서 첫 번째 행 "myaddress"의 주소와 회사 객체를 생성한다. 두 번째 행은 내 회사 규칙에 따라 이름이 같은 회사 인 다른 회사 개체를 만듭니다. 여기에는 클라이언트 참조와 전화 번호가 있습니다.

그래서 나는 그것들이 동일하지만 모든 데이터가 하나의 객체에 병합되어 있는지 확인해야합니다.

현재 두 개체를 모두 사용하는 유틸리티 클래스를 만듭니다 (하나는 기본이고 다른 하나는 병합되므로 충돌이 발생하면 우선 순위가 있습니다), 각 변수를 통해 값을 할당합니다 어떤 것이 있으면. 이것은 무거운 약간의 보일러 판이고 나는 수동 작업을하기 위해 활용할 수있는 유틸리티가있을 것으로 기대하고있었습니다.

이 예제는 다른 몇 가지 변수가 매우 간단하고 몇 가지 기본 유형과 더 복잡한 항목이 있으므로 단순화되었습니다.

+0

최대 2 개의 개체가 병합되어야합니까? 동일한 열/속성이 두 번 정의되면 어떻게 될까요? 하나만 무시하면 위험하다.? – Achim

+0

그들은 내가 찾은 일치 항목을 병합하는 순간 컬렉션을 반복합니다. 이론적으로 컬렉션을 통해 여러 개의 일치가있을 수 있지만 각 병합은 한 번에 하나씩 완료됩니다. 사용자가 잘못된 데이터를 입력하여 여러 필드 때문에 값을 잃어 버리면 주변에서 볼 수 없습니다. – Jon

답변

37

반사 작용. 예 :

+7

일반적이고 우아한. 그러나 어쨌든 그것은 척박 한 떨림을 내 척추 아래로 떨어 뜨립니다. – CesarGon

+0

선생님 께 아주 좋은 모자! ;-) – BlackTea

+1

어떤 이유로'priValue == Activator.CreateInstance (pi.PropertyType)'는 값 유형에 대해 false를 반환합니다. 대신,'priValue.Equals (Activator.CreateInstance (pi.PropertyType))'는 올바른 출력을 생성합니다. – Mrchief

1

문자열 기반 해시 테이블을 만들어보십시오. 중복 레코드의 트리거로 간주하는 필드의 서브 세트를 키로 연결하십시오. 해시 테이블은 중복을 허용하지 않으므로이 오류를 트리거로 사용하여 추가 처리를 수행 할 수 있습니다.

0

환경 및 요구 사항에 대해 더 많이 알지 못하면이 내용이 유용하지 않을 수 있습니다. 그러나 어떤 종류의 데이터베이스 백엔드를 사용할 수있는 경우 (심지어 클라이언트 측 클라이언트가 무료 인 경우), 데이터를 테이블에 저장하고 SQL Merge 문을 사용하여 데이터를 업데이트 할 수 있습니다. 병합 작업은 필요에 따라 레코드를 추가하거나 업데이트합니다. 트리거를 사용하면 작업을 더욱 세분화 할 수 있습니다. 다소 중량이 많이 드는 솔루션이지만 이미 DBMS가 혼합되어 있다면 쉽게 구현할 수 있습니다.

3

나는 이것을 분리하려고합니다. 나누고 정복하십시오.

먼저 거대한 하나의 목록에있는 모든 개체를 읽으십시오.

두 번째 단계에서는 기본 키 (예 : 회사 이름)를 사용하여 고유 목록을 선택합니다. 별개 목록에서 필드 수가 가장 많은 항목 (마스터)을 사용하십시오. 그런 다음 마스터에 아직없는 모든 필드를 반복하고 값을 병합합니다. LINQ는 복잡한 알고리즘을 수동으로 코딩 할 필요없이 이러한 단계의 많은 부분에서 많은 도움이됩니다.

로직을 나중에 쉽게 사용자 정의 할 수 있습니다. 말하거나 다른 필드의 특별한 비교를 원한다면 '기본 키'와 다른 세트가 있어야합니다.

0

Excel에서 데이터를 검색 할 때 각 행에 개체를 만들 필요가 없습니다.사실, 모든 행을 앞쪽으로 읽는 중간 양식으로 이동 한 다음 거기에서 개체를 만듭니다. 해시 테이블을 사용하는 Kibbey의 솔루션이 여기서도 작동 할 수 있습니다.

+0

안녕하세요, 미안합니다. 쉽게 예를 다소 간소화했습니다. 전체 xls을 데이터 테이블에 직접 읽어서 처리하는 대신 각 처리기에서 직접 처리하는 방법을 사용합니다. – Jon

2

나는 카일 핀리가 Merge Two Objects into an Anonymous Type을 시도했으며 완벽하게 작동하고 있습니다. 이 외에도에서 병합 된 개체를 가지고 간단 그거야 그

var obj1 = new {foo = "foo"};

var obj2 = new {bar = "bar"};

var mergedObject = TypeMerger.MergeTypes(obj1 , obj2);

TypeMerger 병합으로

이며, 무시하는 규정이있다 특정 속성도 있습니다.

+1

TypeMerger는 어떤 네임 스페이스입니까? 그것은 Google을 검색하여도 그것을 찾을 수 없기 때문에 그것은 사용자 정의 개체라고 가정합니다. –

관련 문제