我的数据库中包含超过3千行的表。
我想在字符串数组中获取单列详细信息,我需要将此数组发送到第三方api,但数组长度不应超过1000.
所以我需要根据记录发送3/4不同的数组
string[] deviceIds = FirebaseNotificationList.Select(x => x.DeviceID).ToArray();
我需要将string [] deviceIds分成长度为1000的不同字符串数组
如果我使用下面的代码,它只需要前1000行:
string[] deviceIds = FirebaseNotificationList
.Select(x => x.DeviceID).Take(1000).ToArray();
如何在不遗漏任何行的情况下这样做?
答案 0 :(得分:0)
您可以使用Select
方法重载,它为结果选择器提供元素索引。然后按index/batchSize
进行简单分组会将您的所有商品拆分为所需尺寸的批次:
int batchSize = 1000;
var batches = FirebaseNotificationList
.Select((fn,i) => new { fn.DeviceID, i })
.GroupBy(x => x.i / batchSize)
.Select(g => g.Select(x => x.DeviceID).ToArray());
您还可以使用MoreLINQ Batch来避免创建匿名对象,这些对象在源列表中包含有关其索引的信息
var batches = FirebaseNotificationList
.Select(fn => fn.DeviceID)
.Batch(batchSize); // note that batches will be IEnumerable<T>
答案 1 :(得分:0)
批处理可以通过Linq实现,如下所示。
int BatchSize = 1000;
IEnumerable<string> Tail = DeviceIds;
while (Tail.Count() > 0)
{
var Head = Tail.Take(BatchSize);
// process Head
Tail = Tail.Skip(BatchSize);
}
答案 2 :(得分:0)
这已在以下问题得到解答:Create batches in linq:
public static class MyExtensions
{
public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> items,
int maxItems)
{
return items.Select((item, inx) => new { item, inx })
.GroupBy(x => x.inx / maxItems)
.Select(g => g.Select(x => x.item));
}
}
,用法是:
List<int> list = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
foreach(var batch in list.Batch(3))
{
Console.WriteLine(String.Join(",",batch));
}
输出:
0,1,2
3,4,5-
6,7,8
9
答案 3 :(得分:0)
如果我使用下面的代码,它只需要前1000行:
string[] deviceIds = FirebaseNotificationList
.Select(x => x.DeviceID).Take(1000).ToArray();
是的,你会的。您可以使用Select的重载来索引结果。例如,如果您有3345条记录,则将其除以批量大小(1000),最后将获得批次0,1,2,3。以下是代码,并附有说明:
int batchSize = 1000;
string[] deviceIds = FirebaseNotificationList
.Select((x, itemNumber) => new { x.DeviceID, ItemNumber =
itemNumber).GroupBy(x => x.ItemNumber / batchSize)
.Select(g => g.Select(x => x.DeviceID).ToArray());
<强>解释强>:
ItemNumber
是给予记录的索引。因此,ItemNumber
小于1000的记录除以1000,最终会得到0(整数除法),对于ItemNumber
大于1000且小于1999的记录,最终会得到1,依此类推。因此,您将使用范围从0到x的GroupBy
结束记录组,其中x将是最后一批的编号。换句话说,每个组将包含每个批次的记录。在最后Select
中,您要从每个组中选择记录(批处理)。