繁体   English   中英

如何 AddRange 许多 IEnumerable 列表<ienumerable<t> &gt; 进入 IEnumerable <list<int> &gt; </list<int></ienumerable<t>

[英]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需要一个ListIEnumerable ,但您已经给它一个IEnumerableIEnumerable 那些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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM