2016-02-12 66 views
-3

我對C#很陌生,我有一個關於HashSets的問題。我用它們從列表中獲取唯一值,但現在我試圖將它們與嵌套列表一起使用。我有一個列表(每個包含2個數字),我想拉出唯一的數字對C#hashSet的列表

例如,我有一些面板。對於每一個,我已經把它們的尺寸(長度寬度)放到一個列表中,並將該列表放到另一個列表中,所以我有這樣的: [[10,5],[10,6],[10,5] ,[10,7],[10,7]] 我想要的是提取獨特的信息對,以便我可以: [[10,5],[10,6],[10,7] ]

我怎麼會去這個

回答

0

考慮使用Tuple<T1, T2>對象的列表,而不是一個列表的列表。使用Tuple的優點在於,它可以確保列表中的所有元素包含相同數量的子元素,並且可以防止它們在創建後被修改。

0

首先,由於您只在子列表中存儲了2個值,因此可以使用KeyValuePair structure來存儲數據。然後,你可以這樣做:

  var initialList = new List<KeyValuePair<int, int>>(); 
      var listOfDistinctItems = new List<KeyValuePair<int, int>>(); 
      //populate initial list ... 

      foreach(var item in initialList) 
      { 
       if (listOfDistinctItems.Exists(di => di.Key == item.Key && di.Value == item.Value)) 
        continue; 

       listOfDistinctItems.Add(item); 
      } 
0

你可以讓另一類爲你做它或使用lambda表達式處理,並轉換您的清單HashSet的... 如何:)... 對於第一種方法有是.net中的一個名爲IEqualityComparer的接口。 您可以實現這樣一個自定義類這個接口:

class ListEqCompare : IEqualityComparer<List<int>> 
{ 
    public bool Equals(List<int> x, List<int> y) 
    { 
     if (x.Count != y.Count) 
      return false; 
     for (int i = 0; i < x.Count; i++) 
     { 
      if (x[i] != y[i]) 
       return false; 
     } 
     return true; 
    } 

    public int GetHashCode(List<int> obj) 
    { 
     int hash = 0; 
     foreach (int num in obj) 
      hash = hash^EqualityComparer<int>.Default.GetHashCode(num); 

     return hash; 
    } 
} 

在這個類的每個列表的散列使用列表中的所有號碼的散列的XOR運算......你可以用其他方法,比如添加,乘法等,具體取決於問題的領域。 一旦哈希已準備就緒,兩個對象具有相同的哈希()函數中扮演的角色,並在年底名單... 比較,你可以使用你的類以這種方式等於:

var newList = list.Distinct(new ListEqCompare()); 

另一種方式是將列表轉換爲HashSets並使用HashSet的現有功能進行比較...

var newList = list.Select(x => new HashSet<int>(x)) 
       .Distinct(HashSet<int>.CreateSetComparer()).ToList();