gpt4 book ai didi

c# - 从 IEnumerable 到 List 的强制转换无效

转载 作者:太空宇宙 更新时间:2023-11-03 17:48:23 25 4
gpt4 key购买 nike

我正在 Unity3D 项目中处理 C# 脚本,我试图获取字符串列表并获取排列的二维列表。使用this answer's GetPermutations()按照以下方式:

List<string> ingredientList = new List<string>(new string[] { "ingredient1", "ingredient2", "ingredient3" });

List<List<string>> permutationLists = GetPermutations(ingredientList, ingredientList.Count);

但它抛出一个隐式转换错误:

IEnumerable<IEnumerable<string>> to List<List<string>> ... An explicit conversion exists (are you missing a cast)?

所以我看了几个地方,比如here并提出以下修改:

List<List<string>> permutationLists = GetPermutations(ingredientList, ingredientList.Count).Cast<List<string>>().ToList();

但它会在运行时中断,在内部得到处理,并允许它在不指示故障的情况下继续运行——可能是因为它在 Unity3D 中运行。这是我停止调试脚本后在 Unity3D 中看到的内容:

InvalidCastException: Cannot cast from source type to destination type.
System.Linq.Enumerable+<CreateCastIterator>c__Iterator0`1[System.Collections.Generic.List`1[System.String]].MoveNext ()
System.Collections.Generic.List`1[System.Collections.Generic.List`1[System.String]].AddEnumerable (IEnumerable`1 enumerable) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Collections.Generic/List.cs:128)
System.Collections.Generic.List`1[System.Collections.Generic.List`1[System.String]]..ctor (IEnumerable`1 collection) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Collections.Generic/List.cs:65)
System.Linq.Enumerable.ToList[List`1] (IEnumerable`1 source)

我仍然认为转换不正确,因此我还尝试了以下方法以及更多我不记得的方法:

List<List<string>> permutationLists = GetPermutations(ingredientList, ingredientList.Count).Cast<List<List<string>>>();

List<List<string>> permutationLists = GetPermutations(ingredientList.AsEnumerable(), ingredientList.Count);

以及像在 C 或 Java 中那样在方法调用之前用括号显式转换,但仍然无济于事。


那么我应该如何转换 GetPermutations() 的结果呢?函数获取 List<List<string>> ?或者,我如何修改函数以仅返回 List<List<string>>因为我不需要它为泛型工作?我尝试自己修改方法如下:

List<List<string>> GetPermutations(List<string> items, int count)
{
int i = 0;
foreach(var item in items)
{
if(count == 1)
yield return new string[] { item };
else
{
foreach(var result in GetPermutations(items.Skip(i + 1), count - 1))
yield return new string[] { item }.Concat(result);
}

++i;
}
}

但是,删除了 <T>从函数名称中它打破了声明主体不能是迭代器 block 。我之前没有使用 C# 的经验,而且我对强类型语言中的模板函数很陌生,因此非常感谢任何解释/帮助。

我不确定如何查找这个问题,所以如果这是重复的,请在此处发布,我会立即删除此帖子。

最佳答案

So how should I be casting the results from the GetPermutations() function to get a List<List<string>>

最佳解决方案:不要。为什么首先需要将序列变成列表?将其保存为序列序列。

如果必须的话:

GetPermutations(...).Select(s => s.ToList()).ToList()

如果你想修改原来的方法,做同样的事情:

IEnumerable<List<string>> GetPermutations(List<string> items, int count)
{
int i = 0;
foreach(var item in items)
{
if(count == 1)
yield return new List<T>() { item };
else
{
foreach(var result in GetPermutations(items.Skip(i + 1), count - 1))
yield return (new string[] {item}.Concat(result)).ToList();
}

++i;
}
}

然后做GetPermutations(whatever).ToList()你有一个列表列表。但同样,不要这样做。如果可能,请按顺序排列所有内容。

I want to turn the sequence into a list so that I can sort the elements alphabetically and re-join them as a sorted, single comma-delimited string.

好的,那就这样吧。让我们将您的方法重写为扩展方法 Permute() .让我们创建一些新的单行方法:

static public string CommaSeparate(this IEnumerable<string> items) =>
string.Join(",", items);

static public string WithNewLines(this IEnumerable<string> items) =>
string.Join("\n", items);

static public IEnumerable<string> StringSort(this IEnumerable<string> items) =>
items.OrderBy(s => s);

然后我们有以下内容——我将在进行时注释类型:

string result = 
ingredients // List<string>
.Permute() // IEnumerable<IEnumerable<string>>
.Select(p => p.StringSort()) // IEnumerable<IEnumerable<string>>
.Select(p => p.CommaSeparate())// IEnumerable<string>
.WithNewLines(); // string

我们完成了。 当您编写只做一件事并且做得很好的方法时,看看代码是多么清晰和直接。看看按顺序排列所有内容是多么容易,因为它应该是这样。

关于c# - 从 IEnumerable 到 List 的强制转换无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50183219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com