C# 如何调用IEnumerable

C# 如何调用IEnumerable,c#,types,C#,Types,我有一个子程序: 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++)

我有一个子程序:

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);
    }
私有静态IEnumerable置换(IEnumerable源)
{
var c=source.Count();
如果(c==1)
收益回报源;
其他的
对于(int i=0;i
那么如何在main函数中调用它呢

static void Main(string[] args)
{
    string input = "abcdefghijk";
    IEnumerable<string> summary;
    summary= permutations<string>(IEnumerable<string> input);// obviously wrong, but how??
}
static void Main(字符串[]args)
{
字符串输入=“abcdefghijk”;
i数不清的摘要;
summary=排列(IEnumerable输入);//显然是错误的,但如何操作??
}

除非置换在不同的类中。

由于不能直接实例化
IEnumerable
必须传入实现此接口的类(一种常用的选择是使用
列表来保存数据)

NET framework将自动将字符串解释为字符数组(
char[]
),它实现
IEnumerable
(即
IEnumerable
)。这就是为什么可以将字符串直接传递到方法中,如下所示:

static void Main(string[] args)
{
    string input = "abcdefghijk";
    var summary = permutations(input);
}
上面的代码是正在发生的事情的更明确版本的缩写,可以用下面的代码来描述,它有一个方法调用,该方法调用显式地匹配
置换
方法的签名

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

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

    IEnumerable<IEnumerable<char>> summary = permutations(inputArray);
}
static void Main(字符串[]args)
{
字符串输入=“abcdefghijk”;
IEnumerable inputArray=input.ToCharArray();
IEnumerable summary=置换(输入阵列);
}

最简单的方法是创建
字符串的列表

List<string> strArr = new List<string>();
strArr.Add("firstItem");
strArr.Add("secondItem");
strArr.Add("thirdItem");
IEnumerable<IEnumerable<string>> summary = permutations<string>(strArr);
List strArr=new List();
添加(“第一项”);
添加(“第二项”);
补充(“第三方”);
IEnumerable summary=置换(strArr);

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

permutations<char>(input);
第二个调用使用编译器类型推断,因此不必指定t

然后:

        foreach (var outerEnumerator in permutations(test))
        {
            foreach (var singleChar in outerEnumerator)
            {
                Console.WriteLine(singleChar);
            }
        }
和具有显式类型和良好格式的版本(每个单词在单独的行中):

foreach(置换中的IEnumerable外部枚举器(测试))
{
foreach(外部计数器中的字符singleChar)
{
Console.Write(单字符);
}
Console.WriteLine();
}
现在我们知道了方法要做什么:

        var test = "test";
        foreach (IEnumerable<char> testPermutation in permutations(test))
        {
            var permutationString = new string(testPermutation.ToArray());
            Console.WriteLine(permutationString);
        }
var test=“test”;
foreach(置换中的IEnumerable testPermutation(测试))
{
var permutationString=新字符串(testPermutation.ToArray());
Console.WriteLine(排列字符串);
}

调用该函数很容易,您只需要:

permutations(input)
这将为您提供一个由字符序列组成的结果。要将内部的
IEnumerable
转换为字符串,只需使用
选择

summary = permutations(input).Select(chars => new string(chars.ToArray()));

无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“System.Collections.Generic.IEnumerable”。存在显式转换(是否缺少强制转换?)当传递字符串时,置换的返回类型为
IEnumerable
。@Love这是正确调用的,您只是没有正确处理方法的结果。这是一个字符串置换,我要打印所有组合。如果答案不同,也许您可以对permutations()返回的内容进行评论?你想要一个字符串集合,一个字符集合,还是其他什么?传递给permutations()的集合将影响返回类型。我想收集所有字符串,它们是字符串的排列。@Love:这个函数的实际应用是什么?它挂起在我的系统中。不,存在异常。无法从“system.Collections.Generic.IEnumerable”转换为“char[]”@Love您必须在4.0之前的版本上。我将相应地调整代码。如果/当您升级到4.0时,
ToArray
呼叫可以省略。+1谢谢!这是最正确的答案,因为它解决了调用者使用函数的意图,而不仅仅是用
var
修复编译错误。
        var test = "test";
        foreach (IEnumerable<char> testPermutation in permutations(test))
        {
            var permutationString = new string(testPermutation.ToArray());
            Console.WriteLine(permutationString);
        }
permutations(input)
summary = permutations(input).Select(chars => new string(chars.ToArray()));