在数组中建立一串排列

本文关键字:一串 排列 数组 建立 | 更新日期: 2023-09-27 18:31:00

我有一个需要调用的制裁 API,传入一串值。 这些值构造如下:

string searchString = string.Join(" ", myList.ToArray());
// remove any numbers and return complete words
MatcCollection strMatch = Regex.Matches(searchString, @"[^'W'd]+");
var values = strMatch.Cast<Group>().Select(g => g.Value).ToArray();
var combinations = values.Permutations();
现在,我

有了我需要的数组,我调用下面的排列方法:

public static IEnumerable<IEnumerable<T>> Permutations<T>(this IEnumerable<T> source)
    {
        if (source == null)
            throw new ArgumentException("source");
        return permutations(source.ToArray());
    }

排列方法是:

private static IEnumerable<IEnumerable<T>> permutations<T>(IEnumerable<T> source)
    {
        var c = source.Count();
        if (c == 1)
            yield return source;
        else
            for (int i = 0; i < c; i++)
                foreach (var p in permutations(source.Take(i).Concat(source.Skip(i + 1))))
                    yield return source.Skip(i).Take(1).Concat(p);
    }

使用包含 7 个项目 {一、二、三、四、五、六、七} 的示例列表,此代码返回长度为 7 个元素的大量列表。

我需要创建以下内容:

第一次迭代:

返回结果 = 1

第二次迭代返回结果 = 1 + ' ' + 2

如此等等

我从SO上的帖子中获得了上面的示例代码,所以不知道如何正确更改它以获得我需要的东西。

在数组中建立一串排列

那么我是否正确,您不仅想要 7 个项目的所有排列,还希望枚举它们的任何子集(类似于所有组合)?

我想获得该行为的最简单方法是向permutations方法添加某种长度参数:

private static IEnumerable<IEnumerable<T>> permutations<T>(IEnumerable<T> source, int length)
{
    var c = source.Count();
    if (length == 1 || c == 1)
        foreach(var x in source)
            yield return new T[] { x };
    else
        for (int i = 0; i < c; i++)
            foreach (var p in permutations(source.Take(i).Concat(source.Skip(i + 1)), length - 1))
                yield return source.Skip(i).Take(1).Concat(p);
}

然后使用从 1 到 n 的参数调用此方法:

public static IEnumerable<IEnumerable<T>> Permutations<T>(this IEnumerable<T> source)
{
    if (source == null)
        throw new ArgumentException("source");
    var src = source.ToArray();
    for (int i = 1; i <= src.Length; i++)
        foreach (var result in permutations(src, i))
            yield return result;
}

希望我没有打错字...