1. ホーム
  2. c#

[解決済み】リストをN個のサイズに分割する。

2022-03-30 20:05:52

質問

あるリストを一連の小さなリストに分割しようとしています。

私の問題点 リストを分割する関数が、正しいサイズのリストに分割されません。サイズ30のリストに分割されるはずが、サイズ114のリストに分割されてしまいます。

どうすれば、この関数でリストをX個のListに分割することができますか? 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

解決方法は?

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)); 
    }  
}