[英]How to AddRange many lists of IEnumerable<IEnumerable<T>> into IEnumerable<List<int>>
我有这些功能
public static IEnumerable<IEnumerable<T>> GetPermutations<T>(IEnumerable<T> items, int count)
{
int i = 0;
foreach (var item in items)
{
if (count == 1)
yield return new T[] { item };
else
{
foreach (var result in GetPermutations(items.Skip(i + 1), count - 1))
yield return new T[] { item }.Concat(result);
}
++i;
}
}
public static List<List<int>> GetAllValidCombinations(List<int> items)
{
var finalList = new List<List<int>>();
switch (items.Count)
{
case 1:
finalList.Add(items);
break;
case 3:
finalList.AddRange(GetPermutations(items, 2));
finalList.AddRange((List<List<int>>)GetPermutations(items, 3));
break;
}
return finalList;
}
我想从GetAllValidCombinations得到一个 List<List> 。
In the case 3 of GetAllValidCombinations in the first line im getting: Error CS1503 Argument 1: cannot convert from 'System.Collections.Generic.IEnumerable<System.Collections.Generic.IEnumerable>' to 'System.Collections.Generic.IEnumerable<System .Collections.Generic.List>'
如果我尝试第二行我得到错误 Specified cast is not valid
我怎样才能在一行中做到这一点?
AddRange
需要一个List
的IEnumerable
,但您已经给它一个IEnumerable
的IEnumerable
。 那些IEnumerable
可以是任何东西,不一定是列表,对吧? 它们可能是集合或 arrays 或我编写的其他类型,恰好实现了IEnumerable<T>
...这就是编译器给你错误的原因。
正如您编写GetPermutations
,我们可以看到它们实际上是T
的 arrays ,所以您正在尝试将一堆 arrays 添加到列表列表中? 这没有多大意义,不是吗?
幸运的是, ToList
将任何IEnumerable
转换为List
。 您应该使用Select
将此方法应用于嵌套在外部IEnumerable
内的每个IEnumerable
:
var enumerableOfEnumerables = GetPermutations(items, 2);
finalList.AddRange(enumerableOfEnumerables.Select(x => x.ToList()));
清道夫的回答是赚钱,你也可以通过仅使用内部集合中的列表并使其完全通用来对其进行一些重构。
public static IEnumerable<List<T>> GetPermutations<T>(List<T> items, int count)
{
for (var index = 0; index < items.Count; index++)
if (count == 1)
yield return new List<T> { items[index] };
else
foreach (var result in GetPermutations(items.Skip(index + 1).ToList(), count - 1))
yield return new List<T> { items[index] }
.Concat(result)
.ToList();
}
public static IEnumerable<List<T>> GetAllValidCombinations<T>(List<T> items)
{
if (items.Count == 1)
return new List<List<T>> {items};
if (items.Count == 3)
return GetPermutations(items, 2)
.Concat(GetPermutations(items, 3));
return Enumerable.Empty<List<T>>();
}
用法
var results = GetAllValidCombinations(new List<int>() {1, 2, 3});
foreach (var result in results)
Console.WriteLine(string.Join(",",result));
Output
1,2
1,3
2,3
1,2,3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.