首页 >后端开发 >C++ >C#中如何高效查找数组元素的所有组合?

C#中如何高效查找数组元素的所有组合?

Linda Hamilton
Linda Hamilton原创
2025-01-19 23:07:08604浏览

How to Efficiently Find All Combinations of Array Elements in C#?

高效查找C#数组元素的所有组合

在处理数组元素时,提取所有可能的元素组合非常有用。这项任务经常出现在数据分析、组合优化等领域。

含重复元素的排列组合

假设有一个数组 [1, 2, 3, 4]。要查找长度为 2 的所有含重复元素的组合,可以使用以下函数:

<code class="language-csharp">static IEnumerable<IEnumerable<T>> GetPermutationsWithRept<T>(IEnumerable<T> list, int length)
{
    if (length == 1) return list.Select(t => new T[1] { t });
    return GetPermutationsWithRept(list, length - 1)
        .SelectMany(t => list, (t1, t2) => t1.Concat(new T[1] { t2 }));
}</code>

此函数考虑包含重复元素的组合,例如 [1, 1]、[1, 2] 等。

排列组合(不含重复元素)

要排除重复元素,请使用 GetPermutations 函数:

<code class="language-csharp">static IEnumerable<IEnumerable<T>> GetPermutations<T>(IEnumerable<T> list, int length)
{
    if (length == 1) return list.Select(t => new T[1] { t });
    return GetPermutations(list, length - 1)
        .SelectMany(t => list.Where(o => !t.Contains(o)), (t1, t2) => t1.Concat(new T[1] { t2 }));
}</code>

此函数确保组合例如 [1, 2]、[1, 3] 和 [2, 3],但不包含 [1, 1]。

含重复元素的K组合

考虑查找长度为 2 的含重复元素的组合,允许元素多次出现:

<code class="language-csharp">static IEnumerable<IEnumerable<T>> GetKCombsWithRept<T>(IEnumerable<T> list, int length) where T : IComparable
{
    if (length == 1) return list.Select(t => new T[1] { t });
    return GetKCombsWithRept(list, length - 1)
        .SelectMany(t => list.Where(o => o.CompareTo(t.Last()) >= 0), (t1, t2) => t1.Concat(new T[1] { t2 }));
}</code>

此函数生成组合,例如 [1, 1]、[1, 2] 和 [2, 2]。

K组合(不含重复元素)

对于不含重复元素的组合:

<code class="language-csharp">static IEnumerable<IEnumerable<T>> GetKCombs<T>(IEnumerable<T> list, int length) where T : IComparable
{
    if (length == 1) return list.Select(t => new T[1] { t });
    return GetKCombs(list, length - 1)
        .SelectMany(t => list.Where(o => o.CompareTo(t.Last()) > 0), (t1, t2) => t1.Concat(new T[1] { t2 }));
}</code>

此函数生成组合,例如 [1, 2]、[1, 3] 和 [2, 3]。

以上是C#中如何高效查找数组元素的所有组合?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn