繁体   English   中英

将文件分组为 500MB 块

[英]Group Files into 500MB chunks

我有一个List<FileInfo>文件

List<FileInfo> files = GetFiles();

它有大约 2 GB 的文件。 现在我需要将这些文件分成 500MB 的部分。 在这种情况下,结果将是 4 List<FileInfo> ,所有文件的总和低于 500MB。 我不知道如何将Sum()应用于此..

List<List<FileInfo>> result = files.GroupBy(x => x.Length / 1024 / 1014 < 500)
                                   .Select(x => x.ToList()).ToList();

这是有效的方法。

List<FileInfo> files = new List<FileInfo>();
List<List<FileInfo>> listOfLists= new List<List<FileInfo>>();
files.ForEach(x => {
     var match = listOfLists.FirstOrDefault(lf => lf.Sum(f => f.Length) + x.Length < 500*1024*1024);
     if (match != null)
         match.Add(x);
     else
         listOfLists.Add(new List<FileInfo>() { x });
});

这是您可以使用的通用BatchBySize扩展方法:

public static IEnumerable<List<TSource>> BatchBySize<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, long> sizeSelector,
    long maxSize)
{
    var list = new List<TSource>();
    long sumSize = 0;
    foreach (var item in source)
    {
        var itemSize = sizeSelector(item);
        if (sumSize + itemSize > maxSize && list.Count > 0)
        {
            yield return list;
            list = new List<TSource>();
            sumSize = 0;
        }
        list.Add(item);
        sumSize += itemSize;
    }
    if (list.Count > 0) yield return list;
}

用法示例:

List<List<FileInfo>> result = files
    .BatchBySize(x => x.Length, 500_000_000)
    .ToList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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