2013-08-23 2 views
2

주소 집합이 다른 주소 항목이 있습니다. 각 주소 항목에는 AddressType, City, Zipcode 및 기타 항목이 있습니다. 일부 사용자가 새 addressType을 추가하고 Addressses 모음에 이미 AddressType이 나열되어 있으면 이미 나열되어 있다는 경고를 보내는 확인서를 작성 중입니다. 어떻게해야합니까? 몇 가지 코드를 첨부했습니다. 지금은 "Job Address"만 확인하고 있습니다. 세 가지 유형의 주소가 있습니다.ObservableCollection에서 중복을 확인하는 방법은 무엇입니까?

 if (Addresses.Any 
      (a => a.AddressType =="Job Address")) 
     { 
      DialogManager.ShowMessageBox(("The type has already been listed "),  
     MessageBoxButton.OKCancel); 
     } 

답변

1

는 사실 후이 확인하는 경우가 HashSet<string>의 크기 사용할 수 있습니다

var types = new HashSet<string>(Addresses.Select(aa => aa.AddressType)); 
if (types.Count < Addresses.Count) 
{ 
    // You have a duplicate... 
    // ...not necessarily easy to know WHO is the duplicate 
} 

위의 코드는 각각 AddressType 인스턴스를 세트에 할당하여 작동합니다. 집합은 추가 된 고유 항목 만 포함하는 모음입니다. 따라서 입력 시퀀스에 복제본이 있으면 집합에 입력 시퀀스보다 적은 항목이 포함됩니다. 당신과 같이이 동작을 설명 할 수

// And an ISet<T> of existing items 
var types = new HashSet<string>(); 

foreach (string typeToAdd in Addresses.Select(aa => aa.AddressType)) 
{ 
    // you can test if typeToAdd is really a new item 
    // through the return value of ISet<T>.Add: 
    if (!types.Add(typeToAdd)) 
    { 
     // ISet<T>.Add returned false, typeToAdd already exists 
    } 
} 

더 좋은 방법은 사전 것, 아마도 명령의 CanExecute을 통해 당신이 비슷한 방식으로 구현 한 경우 :

this.AddCommand = new DelegateCommand<Address>(
    aa => this.Addresses.Add(aa), 
    aa => !this.Addresses.Any(xx => xx.AddressType == aa.AddressType)); 
+0

첫 번째 작업에 감사드립니다. 나는 아직도 잘 모릅니다. 어떻게 작동하는지 설명해 주시겠습니까? –

+1

@C_looksharp : 좀 더 자세한 내용을 포함하도록 답변을 업데이트했습니다. – user7116

1

새로운 AddressComparer 클래스 구현 IEqualityComparer 인터페이스

지금 사용 Contains 방법을 만들기

if(Addresses.Contains(Address,new AddressComparer())) 
{ 
     //your code 
} 
+0

또한 오버라이드 (override) 할 필요가 Address 클래스의 Equals()는 "같은 주소"의 정확한 의미를 정의합니다. 기본적으로 "메모리의 동일한 위치"를 의미합니다. 정확히 동일한 내용을 가진 두 개의 다른 Address 객체는 기본적으로 같지 않습니다. –

관련 문제