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

C# 在2个哈希集c之间交换元素#,c#,hashset,C#,Hashset,如果我有两个大小为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} 我不

如果我有两个大小为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}

我不需要特殊的顺序。

除非您将通过顺序实现hashset,否则您不能。 CLR的HashSet类没有排序,您无法获得“前N个”元素

可能:

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);
但请注意,哈希集不能保证插入顺序。它根本不是一个有序的集合

明确提到:

HashSet
类提供了高性能的集合操作。一套 是一个不包含重复元素的集合,,其 元素没有特定的顺序。


正如DarkFalcon和其他人所说,每个定义的哈希集没有顺序,因此其中没有前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);
  }

}
void Main()
{               
var hashSet1=新HashSet();
hashSet1.Add(1);
hashSet1.Add(2);
hashSet1.Add(3);
hashSet1.Add(4);
hashSet1.Add(5);
var hashSet2=新的HashSet();
hashSet2.Add(6);
hashSet2.Add(7);
hashSet2.Add(8);
hashSet2.Add(9);
hashSet2.Add(0);
交换相位集(哈希集1、哈希集2、哈希集3);
}
私有列表GetXValuesFromHashSet(HashSet HashSet,int count)
{
var list=新列表();
对于(变量i=0;i
根据定义,.NET
HashSet
是一个集合
,它的元素没有特定的顺序。
你为什么要谈论顺序?我并不真正关心具体的顺序,我只需要在两个HashSet之间交换项目,所以你要从集合1中选择任意X个项目,从集合2中选择任意X个项目,然后交换它们?你应该提供一个你想做什么的例子,因为详细解释你真正想做什么是没有意义的。“在哈希集之间交换项”是解决方案,您想做什么?另外,请包括一些您试图实现的示例代码。Hm。显然,它实现了IEnumerable接口,该接口按顺序遍历集合。虽然可能没有正式的保证,但如果未修改集的顺序发生变化,我会感到惊讶。@Peter Schneider我最初回答的问题是“如何交换两个哈希集的前五个元素”。我的答案是关于不可能确定——它可能是什么元素。就像一种魅力!谢谢Tim Schmelter!顺序并没有真正困扰我,因为哈希集将作为一个整体进行计算。如果两个集都有公共项,这种方法就有问题。您必须先删除所有,否则添加可能会失败。不,不会。如果将当前值添加到HashSet,add方法将只返回false而不是true,就是这样。无论如何,您都需要首先删除所有项目,否则您将得到一个
false
,这将阻止添加项目。考虑一下像“代码> HASSET1=新HASSET()){ 1, 2, 3 } < /> >和<代码> HASSET2=新HASSET(){{ 1, 2, 3 } /CODE >所发生的情况。正确的结果是两组数据保持不变。您的方法将从第二个集合中删除所有。我还建议将这些方法设置为泛型,这样它们就可以用于任何类型,而不仅仅是
int
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);
  }

}