Linq以四元包的形式获取数据

本文关键字:获取 数据 四元 Linq | 更新日期: 2023-09-27 18:18:11

我喜欢将所有数据选择为不可预测数量的第四元包(每个包包含四个项目),如下所示:

foreach(var quaternary in myEnauerable.ToQuaternaryPackages())
{
    //Whatever (Like: l=page.Add(new List()))
    foreach(var item in quaternary)
    {
        //Whatever (Like: l.Add(item))
    }
}

Linq以四元包的形式获取数据

我想你正在寻找类似MoreLINQ Batch方法的东西:

foreach (var batch in myEnumerable.Batch(4))
{
    foreach (var item in batch)
    {
        // ...
    }
}

请注意,如果总数不能被4整除,则最后一批将少于4项。(例如,如果一开始有14件商品,你将得到3批,每批4件,然后是2件。)

您可以获取MoreLINQ作为一个大的Nuget包,或作为单独的包(例如Batch包)。

使用linq:

非常简单
public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> source, int batchSize)
{
    for (int i = 0; i < source.Count(); i+=batchSize)
    {
        yield return source.Skip(i).Take(batchSize);
    }
}

以这种方式按项目的batchSize拆分列表,如果项目的计数不能被批大小整除,则最后一次迭代将产生剩余的可枚举项。

首先,创建一个简单的Batch方法(将其放在一个静态类中):

public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> source, int batchSize)
{
    List<T> temp = new List<T>();
    foreach (T item in source)
    {
        temp.Add(item);
        if (temp.Count == batchSize)
        {
            yield return temp.Select(n => n);
            temp.Clear();
        }
    }
    if (temp.Any())
    {
        yield return temp.Select(n => n);
    }
}

然后像这样使用:

foreach(var quaternary in myEnauerable.Batch(4))
{
    //Whatever (Like: l=page.Add(new List()))
    foreach(var item in quaternary)
    {
        //Whatever (Like: l.Add(item))
    }
}

无耻地从TroyGoode的PagedList库窃取:https://github.com/TroyGoode/PagedList/blob/master/src/PagedList/PagedListExtensions.cs

public static IEnumerable<IEnumerable<T>> Partition<T>(this IEnumerable<T> superset, int pageSize)
{
  if (superset.Count() < pageSize)
    yield return superset;
  else
  {
    var numberOfPages = Math.Ceiling(superset.Count() / (double)pageSize);
    for (var i = 0; i < numberOfPages; i++)
      yield return superset.Skip(pageSize * i).Take(pageSize);  
  }
}

像这样使用:

var result=myEnumerable.Partition(4);

如果您确实需要结果不可预测(即随机),我建议使用以下算法:

  1. 创建列表中所有元素的随机排列
  2. 将它们分成四组。

对于第二部分,已经提供了许多好的答案。第一部分是Eric Lippert关于使用LINQ创建排列的深入系列文章。