gpt4 book ai didi

c# - 如果随机访问不可用,如何高效地获取每对(无序的)不同集合元素

转载 作者:行者123 更新时间:2023-11-30 20:34:49 25 4
gpt4 key购买 nike

示例:我有集合 {1, 2, 3, 4}。我想获得所有(无序)对的不同元素,它们是:{1,2}, {1,3}, {1,4}, {2,3} >、{2,4}{3,4}

如果我有一个IList,我可以这样做:

IList<MyType> list = ... // fill the list elements

for (int i = 0; i < list.Count - 1; i++)
for (int j = i+1; j < list.Count; j++)
{
... // now we have the pair of list[i] and list[j]
}

对于LinkedList我也知道怎么做;除了索引 ij 之外,它几乎是一样的,我们有两个 LinkedListNodes fstsnd。每当我们调用 fst.Next 时,我们都会设置 snd = fst.Next

对于 n 元素的列表,上述方法采用 (n-1)*n/2 迭代步骤。 (对于 i = 0,我们有 j = 1 ... n-1,所以 n-1 步骤。对于 i = 1 我们有 j = 2 ... n-1,所以 n-2 步骤。依此类推。总计为 (n -1) + (n-2) + ... + 3 + 2 + 1 = (n-1)*n/2 步骤。)

有没有办法用任何 ICollection 来做到这一点?我认为 IEnumerator 可以做到这一点,但似乎没有办法告诉 IEnumerator “移动到那个引用!”就像我可以用 LinkedListNode 做的那样。

编辑:

我不是在寻找这个解决方案:

foreach (MyType a in list)
foreach (MyType b in list)
{
if (a == b)
continue;

... // now we have the pair of a and b
}

对于 n 元素的集合,这种方法需要 n^2 迭代步骤,比上面的方法多了一倍多,所以显然不如性能。

编辑:

事先将集合变成List似乎是最简单的方法,对于大的n,性能损失可以忽略不计,因为它只增加了n 整个交互的步骤(新列表必须由 n 元素填充)。所以我会坚持下去。

最佳答案

IEnumerable 是一个只进迭代器; ICollection 没有索引访问。您可以做的是在第一次迭代期间将可枚举项放入缓冲区,然后使用嵌套的 for 循环。

var enumerable = Enumerable.Range(0, 10);

var buffer = new List<int>();

using (var enumerator = enumerable.GetEnumerator())
{
if (enumerator.MoveNext())
{
buffer.Add(enumerator.Current);
while (enumerator.MoveNext())
{
var current = enumerator.Current;
buffer.Add(current);

Handle(buffer[0], current);
}
}
}

for (int i = 1; i < buffer.Count - 1; i++)
for (int j = i + 1; j < buffer.Count; j++)
Handle(buffer[i], buffer[j]);

或者,如果您不关心再遍历这些项目,您可以只使用 enumerable.ToArray() 然后使用嵌套的 for那个数组。

关于c# - 如果随机访问不可用,如何高效地获取每对(无序的)不同集合元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38674207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com