在2个哈希集之间交换元素c#

时间:2014-09-12 14:15:46

标签: c# hashset

如果我有2个大小为5的哈希集,我如何从第一个哈希集中取出x项并将它们与第二个哈希集中的x项交换?

例如:

          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}

我不需要特别的订单。

3 个答案:

答案 0 :(得分: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>类提供高性能的集合操作。一套   是一个不包含重复元素的集合,和其中   元素没有特别的顺序。

答案 1 :(得分:1)

除非您通过排序实现hashset,否则不能这样做。 HashSet CLR级别没有订购,您无法获得&#34;首先N&#34;元素

答案 2 :(得分: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);
  }

}