2016-01-22 58 views
2

我正在嘗試查找列表中的項目數量,該項目本身就是一個列表。我發現使用LINQ here這個例子:通過列表屬性來比較相等

List<Person> distinctPeople = allPeople 
    .GroupBy(p => p.PersonId) 
    .Select(g => g.First()) 
    .ToList(); 

這很好地工作,如果物業PersonId是標量。如果不是我挑ListOfActions它工作的第一項

List<Target> distinctTargets = SelectedTargets.GroupBy(p => p.ListOfActions).Select(g => g.First()).ToList(); 

:但對我來說,這並不工作,並在下面的SelectedTargets的項目總是返回不同,即使ListOfActions是所有項目相同:

List<Target> distinctTargets = SelectedTargets.GroupBy(p => p.ListOfActions[0]).Select(g => g.First()).ToList(); 

那麼我該如何檢查整個列表ListOfActions的等號? (不一定要用戶LINQ)

SelectedTargets的定義是:

List<Target> SelectedTargets = new List<Target>(); 

,是DispensingActionList:

private DispensingActionList ListOfActions = new DispensingActionList(); 
public class DispensingActionList : List<DispensingAction> 
    { ... 
+0

爲什麼不重寫ListOfActions類的Equals()方法? –

+0

請參閱[「應該在標題中包含」標籤「?」](http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles),其中共識是「不,他們不應該」! –

+0

好的。我會記住的。抱歉。 – packoman

回答

2

對於比較序列的GroupBy過載,您可以使用自定義IEqualityComparer<T>。例如,這其中使用Enumerable.SequenceEqual

public class SequenceComparer<T> : IEqualityComparer<IEnumerable<T>> 
{ 
    public bool Equals(IEnumerable<T> x, IEnumerable<T> y) 
    { 
     if (x == null && y == null) return true; 
     if (x == null || y == null) return false; 

     var comparer = EqualityComparer<T>.Default; 
     return x.SequenceEqual(y, comparer); 
    } 

    public int GetHashCode(IEnumerable<T> items) 
    { 
     unchecked 
     { 
      int hash = 17; 
      foreach (T item in items) 
      { 
       hash = hash * 23 + (item == null ? 0 : item.GetHashCode()); 
      } 
      return hash; 
     } 
    } 
} 

現在,這應該工作:

List<Target> distinctTargets = SelectedTargets 
    .GroupBy(p => p.ListOfActions, new SequenceComparer<DispensingAction>()) 
    .Select(g => g.First()) 
    .ToList(); 

當然DispensingAction也需要重寫Equals它們是否是相同的參照對象有意義,而不是隻比較檢查或不。

+0

我剛剛嘗試了這個。它很好地工作,所以謝謝!然而,我更喜歡一個解決方案,我不必實例化一個新對象(SequenceComparer)來測試相等性,以便Linq行將保持如下所示:'List distinctTargets = SelectedTargets.GroupBy(p => p.ListOfActions )。選擇(g => g.First())。ToList();''我重寫'Equals(IList obj)'並使用上面的Linq行,但返回'false'。有什麼建議麼? – packoman