相关疑难解决方法(0)

如何批量循环IEnumerable

我正在开发一个ac#program,它有一个"IEnumerable users",可以存储400万用户的ID.我需要遍历Ienummerable并每次提取批量1000个ID以在另一个方法中执行某些操作.

如何从Ienumerable开始一次提取1000个ID ...做一些其他事情然后获取下一批1000等等?

这可能吗?

c# ienumerable

73
推荐指数
7
解决办法
5万
查看次数

当要跳过的数字很大时,实体Framerowk Skip/Take非常慢

所以,代码非常简单:

var result = dbContext.Skip(x).Take(y).ToList();
Run Code Online (Sandbox Code Playgroud)

当x很大(~1.000.000)时,查询非常慢.y很小 - 10,20.

这个的SQL代码是:(来自sql profiler)

SELECT ...
FROM ...
ORDER BY ...
OFFSET x ROWS FETCH NEXT y ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

问题是,是否有人知道如何加快这种分页?谢谢.

sql linq performance entity-framework

11
推荐指数
3
解决办法
6784
查看次数

Array.Copy vs Skip and take in c#

我正在浏览这个问题和一些类似的问题:

从现有阵列获取子阵列

很多地方我都读到这样的答案:

从现有阵列获取子阵列

我想知道为什么Skip和Take不是数组的恒定时间操作?

反过来,如果它们是常量时间操作,那么Skip和Take方法(最后没有调用ToArray())是否具有相同的运行时间而没有执行Array.Copy的开销,而且空间效率更高?

c# arrays copy skip take

5
推荐指数
1
解决办法
7815
查看次数

为什么 Enumerable 不获取下一批,而是总是获取前 3 项

我正在做一个 POC,将字符串列表分成批次并异步处理每个批次。但是当我运行该程序时,它总是采用第一组项目(根据批量大小为 3)。那么任何人都可以帮助我如何移动到下一组项目。 Take是我写的一个扩展方法。我尝试使用async/await模式。

提前致谢

public class Program
{
    public static async Task Main(string[] args)
    {
        var obj = new Class1();
        List<string> fruits = new()
            {
                "1",
                "2",
                "3",
                "4",
                "5",
                "6",
                "7",
                "8",
                "9",
                "10"
            };
        
        await Class1.Start(fruits);
        Console.ReadLine();
    }
}

public class Class1
{
    private const int batchSize = 3;
    public static async Task Start(List<string> fruits)
    {
        if (fruits == null)
            return;

        var e = fruits.GetEnumerator();
        while (true)
        {    
            var batch = e.Take(3); // always …
Run Code Online (Sandbox Code Playgroud)

c# async-await .net-core asp.net-core

2
推荐指数
1
解决办法
151
查看次数