C# 中没有内建的方法可以实现这个功能。由于 HashSet<T>
没有索引 *,你也不能通过两个循环实现。
如果这只是一次性的需求,最简单的解决方案是在 ToList()
或者 ToArray()
的结果上使用两个嵌套的循环,像这样:
var items = hashSet.ToList();
for (var i = 0 ; i != items.Count ; i++) {
var a = items[i];
for (var j = i+1 ; j != items.Count ; j++) {
var b = items[i];
}
}
如果你正在寻找可重用的内容,可以在 IEnumerable<T>
上创建一个扩展方法来生成所有配对:
static IEnumerable<Tuple<T,T>> MakeAllPairs<T>(this IEnumerable<T> data) {
var items = data.ToList();
for (var i = 0 ; i != items.Count ; i++) {
var a = items[i];
for (var j = i+1 ; j != items.Count ; j++) {
var b = items[i];
yield return Tuple.Create(a, b);
}
}
}
现在您可以在单个循环中迭代您的键值对:
foreach (var pair in hashSet.MakeAllPairs()) {
Console.WriteLine("{0} {1}", pair.Item1, pair.Item2);
}
* 在技术层面上,你可以使用来自Enumerable
的ElementAt<T>(int)
扩展,但在大数据集上执行会非常缓慢。
ToArray()
,For i 0 → size
,For j i → size
。 - Medinoc