2014-09-12 73 views
-3

如果我有2個大小爲5的哈希集,我該如何從第一個哈希集中提取x個項目,並將它們與第二個哈希集合中的x個項目交換?在2個哈希集之間交換元素c#

例如:

  HashSet 1 has elements = {a , b, c , d ,e} 
      HashSet 2 has elements = {r , s ,t ,u , w} 

我想獲得的交換之後:

  HashSet 1 = {r, s , c ,d e} 
      HashSet 2 = {a, b, t , u ,w} 

我不需要speficic秩序。

+3

根據定義,.NET'HashSet的'是一家集'的元素是沒有特定的順序「你爲什麼在談論秩序? – 2014-09-12 14:17:08

+0

我並不在意特定的訂單,我只需要在兩個哈希集之間交換項目 – 2014-09-12 14:18:01

+0

因此,您想從集合1中選擇任何X個項目,集合2中的任何X個項目並交換它們? – 2014-09-12 14:18:45

回答

6

也許:

HashSet<string> hash1 = new HashSet<string>() { "A1", "B1", "C1", "D1" }; 
HashSet<string> hash2 = new HashSet<string>() { "A2", "B2", "C2", "D2" }; 
var firstThreeInOne = hash1.Take(3).ToList(); 
var firstThreeInTwo = hash2.Take(3).ToList(); 
foreach (string str in firstThreeInOne) 
    hash1.Remove(str); 
foreach (string str in firstThreeInTwo) 
    hash2.Remove(str); 
foreach (string str in firstThreeInTwo) 
    hash1.Add(str); 
foreach (string str in firstThreeInOne) 
    hash2.Add(str); 

測試:

Console.WriteLine(string.Join(",", hash1)); // C2,B2,A2,D1 
Console.WriteLine(string.Join(",", hash2)); // C1,B1,A1,D2 

但要注意的一個HashSet並不保證廣告訂單。它根本不是有序的集合。

MSDN提到明確:

HashSet<T>類提供高性能的設置操作。一組 是不包含重複元素的集合,其中和 元素沒有特定的順序。

+0

喜歡拿()。 – 2014-09-12 14:23:54

+0

工程就像一個魅力!謝謝Tim Schmelter!由於哈希集合將作爲一個整體進行評估,因此該命令並不會真正打擾我。 – 2014-09-12 14:28:58

1

除非您將實施哈希集排序,否則您不能。 HashSet類CLR還沒有訂貨,你不能得到 「第一N」 元素

+2

嗯。它實現了IEnumerable接口,該接口顯然按順序遍歷集合。雖然可能沒有一個正式的保證,但如果這個訂單改變了一個未修改的集合,我會感到驚訝。 – 2014-09-12 14:20:59

+1

@Peter Schneider我已經回答的原始問題就是「如何交換兩個哈希集的前五個元素」。我的答案是關於不可能確定 - 它可能是什麼元素。 – 2014-09-12 14:24:55

0

由於DarkFalcon和其他人說每個定義的HashSet沒有順序,因此它裏面沒有第一個x元素。

但是與每個集合一樣,您可以按某種順序使用ElementAt方法獲取元素。

要知道,你可以不知道元素的算爲第一的...

void Main() 
{    
     var hashSet1 = new HashSet<int>(); 
     hashSet1.Add(1); 
     hashSet1.Add(2); 
     hashSet1.Add(3); 
     hashSet1.Add(4); 
     hashSet1.Add(5); 

     var hashSet2 = new HashSet<int>(); 
     hashSet2.Add(6); 
     hashSet2.Add(7); 
     hashSet2.Add(8); 
     hashSet2.Add(9); 
     hashSet2.Add(0); 

    SwapHashSets(hashSet1, hashSet2, 3);  
} 


private List<int> GetXValuesFromHashSet(HashSet<int> hashSet, int count) 
{ 
    var list = new List<int>(); 

    for (var i = 0; i < count; i++) 
    { 
     list.Add(hashSet.ElementAt(i)); 
    } 

    return list; 
} 

private void SwapHashSets(HashSet<int> hashSet1, HashSet<int> hashSet2, int count) 
{ 
    var list1 = GetXValuesFromHashSet(hashSet1, count); 
    var list2 = GetXValuesFromHashSet(hashSet2, count); 

    foreach (var value in list1) 
    { 
     hashSet1.Remove(value); 
    } 

    foreach (var value in list2) 
    { 
     hashSet2.Remove(value); 
    } 

    foreach (var value in list1) 
    { 
     hashSet2.Add(value); 
    } 

    foreach (var value in list2) 
    { 
     hashSet1.Add(value); 
    } 

} 
+0

如果兩套都具有共同項目,則此方法存在問題。您必須首先刪除所有,否則添加可能會失敗。 – 2014-09-12 16:05:48

+0

不,它不。如果給HashSet添加一個當前值,那麼add方法將返回false而不是true,就是這樣。 [Source](http://msdn.microsoft.com/de-de/library/bb353005%28v=vs.110%29.aspx) – EvilFonti 2014-09-15 07:33:57

+1

無論如何你需要先刪除所有項目,否則你會得到一個'錯誤',防止項目被添加。考慮像hashSet1 = new HashSet (){1,2,3}和'hashSet2 = new HashSet (){1,2,3}'的集合會發生什麼情況。核心結果將是兩套保持不變。你的方法從第二組中刪除所有。我也建議使這些方法是通用的,以便它們可以用於任何類型而不是隻用於int。 – 2014-09-15 08:52:31