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))
}
}
我想你正在寻找类似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);
如果您确实需要结果不可预测(即随机),我建议使用以下算法:
- 创建列表中所有元素的随机排列
- 将它们分成四组。
对于第二部分,已经提供了许多好的答案。第一部分是Eric Lippert关于使用LINQ创建排列的深入系列文章。