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