如果我有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}
我不需要特别的订单。
答案 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);
}
}