【发布时间】:2018-01-29 09:21:44
【问题描述】:
我想实现一个方法,它将未知类型的集合作为参数,并返回一个 2 元组的集合,其中包含来自这些元素的所有可能的不同组合(没有重复)。我的代码:
public static IEnumerable<Tuple<T, T>> Get2Combinations<T>(this
IEnumerable<T> col)
{
/*foreach (var item1 in col)
{
col.GetEnumerator().MoveNext();
foreach (var item2 in col)
{
yield return new Tuple<T, T>(item1, item2);
}
}*/
for (int i = 0; i < col.Count(); i++)
{
for (int j = i + 1; j < col.Count(); j++)
{
yield return new Tuple<T, T>(col.ElementAt(i),
col.ElementAt(j));
}
}
}
我正在做的是我取第一个元素并与其他元素取一对。然后使用这个内部 for 循环,我遍历所有剩余的循环。我看到的问题是方法 col.ElementAt(i)。如果我们查看源代码,我们会看到如果 'col' 是 IList 类型,那么它会直接获取给定索引处的值,但是如果采用任何其他集合,这将非常缓慢并且需要很多时间。 我尝试使用 foreach 循环(注释部分)来处理这个问题,这在使用 IEnumerable 时很有效,但是这部分不起作用,因为枚举器对于内部和外部循环都是通用的,因此这会产生所有 2 -元组,其中一些重复。 谁能给我一些建议,如何改进这段代码?
【问题讨论】:
标签: c# collections combinations combinatorics