为了账号安全,请及时绑定邮箱和手机立即绑定

将列表拆分为N个较小的N列表

将列表拆分为N个较小的N列表

C#
隔江千里 2019-07-30 11:01:41
将列表拆分为N个较小的N列表我试图将列表拆分成一系列较小的列表。我的问题:我拆分列表的功能不会将它们拆分成正确大小的列表。它应该将它们分成大小为30的列表,而是将它们分成大小为114的列表?如何使我的功能将列表拆分为X个大小为30或更小的列表?public static List<List<float[]>> splitList(List <float[]> locations, int nSize=30) {            List<List<float[]>> list = new List<List<float[]>>();     for (int i=(int)(Math.Ceiling((decimal)(locations.Count/nSize))); i>=0; i--) {         List <float[]> subLocat = new List <float[]>(locations);          if (subLocat.Count >= ((i*nSize)+nSize))             subLocat.RemoveRange(i*nSize, nSize);         else subLocat.RemoveRange(i*nSize, subLocat.Count-(i*nSize));         Debug.Log ("Index: "+i.ToString()+", Size: "+subLocat.Count.ToString());         list.Add (subLocat);     }     return list;}如果我在144的列表上使用该函数,那么输出是:指数:4,大小:120 指数:3,大小:114 索引:2,大小:114 索引:1,大小:114 索引:0,大小:114
查看完整描述

3 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

public static List<List<float[]>> splitList(List<float[]> locations, int nSize=30)  {        
    var list = new List<List<float[]>>(); 

    for (int i=0; i < locations.Count; i+= nSize) 
    { 
        list.Add(locations.GetRange(i, Math.Min(nSize, locations.Count - i))); 
    } 

    return list; }

通用版本:

public static IEnumerable<List<T>> splitList<T>(List<T> locations, int nSize=30)  {        
    for (int i=0; i < locations.Count; i+= nSize) 
    { 
        yield return locations.GetRange(i, Math.Min(nSize, locations.Count - i)); 
    }  }


查看完整回答
反对 回复 2019-07-30
?
狐的传说

TA贡献1804条经验 获得超3个赞

我建议使用此扩展方法将源列表按指定的块大小分块到子列表:


/// <summary>

/// Helper methods for the lists.

/// </summary>

public static class ListExtensions

{

    public static List<List<T>> ChunkBy<T>(this List<T> source, int chunkSize) 

    {

        return source

            .Select((x, i) => new { Index = i, Value = x })

            .GroupBy(x => x.Index / chunkSize)

            .Select(x => x.Select(v => v.Value).ToList())

            .ToList();

    }

}

例如,如果您将18个项目的列表按每个块5个项目进行分块,则会为您提供4个子列表的列表,其中包含以下项目:5-5-5-3。


查看完整回答
反对 回复 2019-07-30
?
阿晨1998

TA贡献2037条经验 获得超6个赞

怎么样:

while(locations.Any()){    
    list.Add(locations.Take(nSize).ToList());
    locations= locations.Skip(nSize).ToList();}


查看完整回答
反对 回复 2019-07-30
  • 3 回答
  • 0 关注
  • 546 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信