如何优化此 LINQ 查询

本文关键字:LINQ 查询 优化 何优化 | 更新日期: 2023-09-27 18:34:01

我有这个查询

Dasha.Where(x => x[15] == 9).ForEachWithIndex((x,i) => dd[Sex[i]][(int)x[16]]++);

此查询正在Dasha中找到第 15 个索引值为 9 的元素,如果是,则递增 dd[Dashaindex][x[16]] 值。

这里 Dasha 是 double[100][50],dd 是 double[2][10],是 byte[ ],并且只能有值 0 或 1。 0 表示男性,1 表示女性

x[15] 只能介于 0 到 9 之间(包括 0 和 9)。x[16]的规则相同。

它给了我正确的结果。

我尝试将其优化为

Dasha.ForEachWithIndex((x,i) => 
{
    if(x[15] == 9)
        dd[Sex[i]][(int)x[16]]++
});

这给了我错误的结果。我哪里做错了?

我的ForEachWithIndex就像

static void ForEachWithIndex<T>(this IEnumerable<T> enu, Action<T, int> action)
{
    int i = 0;
    foreach(T item in enu)
        action(item, i++);
}

如何优化此 LINQ 查询

这只是关于

 Dasha.ForEachWithIndex((x,i) =>  {
     if(x[15] == 9)
         dd[Sex[i]][(int)x[16]]++ });

这给了我错误的结果。我哪里做错了?

在第一种情况下,您将包含 100 个项目的 Dasha 列表筛选为 n 个项目,然后迭代这 n 个项目。

在第二种情况下,您遍历所有 100 个项目。所以索引会不同,你从[i] 获得的每一行的值也会不同

例如

 Dasha[0] != Dasha.Where(x => x[15] == 9)[0] 

除非达沙[0][15] == 9

您需要

Where之前保存原始索引:

Dasha.Select((x,i) => new {x = x, i = i})
     .Where(a => a.x[15] == 9)
     .ForEach(a => dd[Sex[a.i]][(int)a.x[16]]++);

下面将为您提供与第一次查询相同的结果。

    int counter=0;
    Dasha.ForEachWithIndex((x,i) => 
    {
        if(x[15] == 9)
        {
            dd[Sex[counter]][(int)x[16]]++;
            counter++;
        }
    })