【问题标题】:c# Flatten an unknown layer list of lists to a listc#将列表的未知层列表展平为列表
【发布时间】:2022-11-14 17:05:53
【问题描述】:

我想创建一个可以展平 double[] 的未知层列表的方法。 List<double[]> flattenData = flattenMethod(dataSource);
数据源的类型可能在哪里 List<double[]> List<List<double[]>> List<List<List<double[]>>> ...等等。

我试过 .Select 或 .SelectMany 但它们似乎只适用于特定图层 而且我不知道应该为输入参数类型使用什么类型。 有没有一种通用的方法来实现我想要的?

【问题讨论】:

    标签: c# flatten


    【解决方案1】:

    这应该适用于递归:

    public static IEnumerable<T> Flatten <T>(this IEnumerable seq)
    {
        foreach (var item in seq)
        {
            if (item is T titem)
            {
                yield return titem;
            }
    
            if (item is IEnumerable subSeq)
            {
                foreach (var subItem in subSeq.Flatten<T>())
                {
                    yield return subItem;
                }
            }
        }
    }
    

    一些测试用例:

    List<double[]> doubleList = new List<double[]>
    {
        new double[] { 1, 2, 3 },  new double[] { 4, 5, 6 }
    };
     // following array contains 6 doubles:
    Double[] doubles = doubleList.Flatten<double>().ToArray();
    
    List<List<double[]>> doubleListList = new List<List<double[]>>()
    {
        doubleList, doubleList, doubleList
    };
     // following array contains 18 doubles:
    doubles = doubleListList.Flatten<double>().ToArray();
    
    List<List<List<double[]>>> doubleListListList = new List<List<List<double[]>>>()
    {
        doubleListList, doubleListList, doubleListList
    };
     // following array contains 54 doubles:
    doubles = doubleListListList.Flatten<double>().ToArray();
    

    【讨论】:

      猜你喜欢
      • 2016-01-26
      • 2012-03-19
      • 2013-11-13
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 2018-02-11
      • 2013-11-06
      相关资源
      最近更新 更多