2014-02-21 9 views
0

으로 목록 비교. 나는 IEquatable 인터페이스를 구현하려고 시도했다. 여기에 내가 지금까지 무엇을했는지 있습니다 : 내가 한 annother과 목록을 비교하는 방법에 대한 책을 읽은 적이있다 다른 목록 <t>

/// <summary> 
/// A object holder that contains a service and its current failcount 
/// </summary> 
public class ServiceHolder : IEquatable<ServiceHolder> 
{ 
    /// <summary> 
    /// Constructor 
    /// </summary> 
    /// <param name="service"></param> 
    public ServiceHolder(Service service) 
    { 
     Service = service; 
     CurrentFailCount = 0; 
    } 
    public Service Service { get; set; } 
    public UInt16 CurrentFailCount { get; set; } 


    /// <summary> 
    /// Public equal method 
    /// </summary> 
    /// <param name="obj"></param> 
    /// <returns></returns> 
    public override bool Equals(object obj) 
    { 
     if (obj == null) 
     { 
      return false; 
     } 

     ServiceHolder tmp = obj as ServiceHolder; 
     if (tmp == null) 
     { 
      return false; 
     } 
     else 
     { 
      return Equals(tmp); 
     } 
    } 

    /// <summary> 
    /// Checks the internal components compared to one annother 
    /// </summary> 
    /// <param name="serviceHolder"></param> 
    /// <returns>tru eif they are the same else false</returns> 
    public bool Equals(ServiceHolder serviceHolder) 
    { 
     if (serviceHolder == null) 
     { 
      return false; 
     } 

     if (this.Service.Id == serviceHolder.Service.Id) 
     { 
      if (this.Service.IpAddress == serviceHolder.Service.IpAddress) 
      { 
       if (this.Service.Port == serviceHolder.Service.Port) 
       { 
        if (this.Service.PollInterval == serviceHolder.Service.PollInterval) 
        { 
         if (this.Service.ServiceType == serviceHolder.Service.ServiceType) 
         { 
          if (this.Service.Location == serviceHolder.Service.Location) 
          { 
           if (this.Service.Name == this.Service.Name) 
           { 
            return true; 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
     return false; 
    } 
} 

을하고 나는 그것을 사용하는 곳이다 : 나는 디버깅 및 등호 (=)가 결코 명중 않겠다 기능에 내가 브레이크 포인트를 넣을 때 지금

private void CheckIfServicesHaveChangedEvent() 
{ 
    IList<ServiceHolder> tmp; 
    using (var db = new EFServiceRepository()) 
    { 
     tmp = GetServiceHolders(db.GetAll()); 
    } 

    if (tmp.Equals(Services)) 
    { 
     StateChanged = true; 
    } 
    else 
    { 
     StateChanged = false; 
    } 
} 

합니다.

이것은 내가 잘못 구현했거나 올바르게 호출하지 않은 것으로 생각됩니다.

+0

'tmp'는 하나의 'ServiceHolder'가 아닌 목록입니다. –

+0

두리스트를 비교합니까? – Zapnologica

+1

일반적인 스타일 가이드 라인으로,'tmp' 같은 변수 이름을 사용하지 마십시오. 변수의 타입이 'ServiceHolder'라면,'serviceHolder'라고 부를 수 있습니다. 그것이 'ServiceHolder' 타입의 객체들의 콜렉션이라면, 당신은 그것을'serviceHolders'라고 부를 수 있습니다. 처음에 여러 개의 tmp를 보았을 때 나는 같은 유형을 공유한다고 생각했습니다. 유형 혼란을 조장해서는 안됩니다. – dureuill

답변

3

그런 다음 최선의 방법을 두 목록의 내용을 비교할 경우 SequenceEqual입니다.

if (tmp.SequenceEquals(Services)) 

이렇게하면 목록의 값에 대한 동등한 의미 체계를 사용하여 두 목록의 내용을 비교합니다. 이 경우 요소 유형은 ServiceHolder이며 이미 이러한 유형의 평등의 의미를 정의한로는

편집

영업 이익은 컬렉션의 순서는 중요하지해야한다는 주석 잘 작동합니다. 해당 시나리오의 경우 다음을 수행 할 수 있습니다.

+0

목록의 순서를 확인합니까? 주문에 대해 신경 쓰지 않으니 까? 당신이 순서에 대해 걱정하지 않으려면이 @Zapnologica – Zapnologica

+1

은 다음 Except' – JaredPar

+0

'과 같은 방법을 사용해야합니다, 동일하게 순서를 필요로 할 것이다 또는 당신은 요소를 주문하지 않는 콜렉션에 객체를 저장한다 명령이 필요하지 않다면'HashSet' (C#> = 3.5)과 같은 것입니다. – dureuill

0

linq를 사용하면 가장 쉽게 주문 목록을 비교할 수 있습니다.

List<ServiceHolder> result = tmp.Except(Services).ToList();