高效查找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中文网其他相关文章!