如何优化此LINQ查询

时间:2012-05-12 11:46:31

标签: c# .net linq extension-methods

我有这个查询

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]而且Sex是byte []并且只能为0或1. 0表示男性,1表示女性

x [15]只能在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++);
}

3 个答案:

答案 0 :(得分:1)

这只是关于

的部分答案(评论太长)
 Dasha.ForEachWithIndex((x,i) =>  {
     if(x[15] == 9)
         dd[Sex[i]][(int)x[16]]++ });
  

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

在第一种情况下,您将100个项目的Dasha列表过滤到n个项目,然后迭代这些n个项目。

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

e.g。

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

除非Dasha [0] [15] == 9

答案 1 :(得分:0)

您需要在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]]++);

答案 2 :(得分:0)

以下将给出与第一次查询相同的结果。

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