2

我有一个子程序:

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);
    }

那么如何在main函数中调用呢?

static void Main(string[] args)
{
    string input = "abcdefghijk";
    IEnumerable<string> summary;
    summary= permutations<string>(IEnumerable<string> input);// obviously wrong, but how??
}
4

5 回答 5

3

调用函数很简单,你只需要:

permutations(input)

这将为您提供一个字符序列序列的结果。要将内部转换IEnumerable<char>为字符串,只需使用Select.

summary = permutations(input).Select(chars => new string(chars.ToArray()));
于 2012-08-16T19:19:34.570 回答
0

您可以通过两种方式调用它:

permutations<char>(input);

或者

permutations(input);

第二次调用使用编译器类型推断,因此您不必指定T

接着:

        foreach (var outerEnumerator in permutations(test))
        {
            foreach (var singleChar in outerEnumerator)
            {
                Console.WriteLine(singleChar);
            }
        }

以及具有显式类型和良好格式的版本(每个单词在单独的行中):

        foreach (IEnumerable<char> outerEnumerator in permutations(test))
        {
            foreach (char singleChar in outerEnumerator)
            {
                Console.Write(singleChar);
            }
            Console.WriteLine();
        }

现在我们知道要做什么方法了:

        var test = "test";
        foreach (IEnumerable<char> testPermutation in permutations(test))
        {
            var permutationString = new string(testPermutation.ToArray());
            Console.WriteLine(permutationString);
        }
于 2012-08-16T19:09:07.980 回答
0
summary = permutations(input);

除非排列在不同的类别中。

于 2012-08-16T19:06:16.190 回答
0

由于您不能IEnumerable直接实例化 a,因此您必须传入一个实现此接口的类(一种流行的选择是使用 aList来保存数据)。

.NET 框架会自动将字符串解释为字符数组( char[]),它实现IEnumerable(ie IEnumerable<char>)。这就是为什么您可以将字符串直接传递到方法中的原因,如下所示:

static void Main(string[] args)
{
    string input = "abcdefghijk";
    var summary = permutations(input);
}

上面的代码是正在发生的事情的更显式版本的简写,可以用下面的代码来描述,它有一个显式匹配方法签名的方法调用permutations

static void Main(string[] args)
{
    string input = "abcdefghijk";

    IEnumerable<char> inputArray = input.ToCharArray();

    IEnumerable<IEnumerable<char>> summary = permutations(inputArray);
}
于 2012-08-16T19:06:45.543 回答
-1

最简单的方法是创建一个列表string

List<string> strArr = new List<string>();
strArr.Add("firstItem");
strArr.Add("secondItem");
strArr.Add("thirdItem");
IEnumerable<IEnumerable<string>> summary = permutations<string>(strArr);
于 2012-08-16T19:06:53.487 回答