2012-05-12 2 views
0

У меня есть этот запросКак оптимизировать этот LINQ запрос

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

Этот запрос находит этот элемент в Dasha которого пятнадцатого значение индекса является 9 и если да, то он увеличивает дд [Dashaindex] [х [16]] значение ,

Здесь Даша double[100][50] и дд это double[2][10] и секс байт [] и может иметь только значение 0 или 1. 0 для мужчин и 1 для женщин

х [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++); 
} 
+1

Что вы пытаетесь оптимизировать? Скорость выполнения? Легкость чтения кода? Минимальное количество символов? Какой бы ни был ответ, пожалуйста, дайте небольшое объяснение обоснованию. Наши ответы могут меняться в зависимости от того, почему вы хотите оптимизировать. –

+0

Поскольку существует 2 метода (Where and ForEachIndex). Я хочу, чтобы одна функция выполняла эту работу. так что ему не нужно перебирать два массива. сначала выведенный где и второй для обновления Foreachwithindex –

+0

Это из-за 'Delayed Execution' –

ответ

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]]++); 
1

Это лишь частичный ответ (слишком долго для комментария) относительно

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

Это дает мне неправильные результаты. Где я делаю неправильно?

В первом случае вы отфильтровываете список из 100 предметов до девяти пунктов, затем вы перебираете эти n элементов.

во втором случае вы перебираете все 100 предметов. Таким образом, индекс будет отличаться, и значение, которое вы получаете от Sex [i] для каждой строки, будет отличаться.

например.

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

если Даша [0] [15] == 9

0

После даст вам тот же результат, как в первом запросе.

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

Какая польза от этой переменной счетчика. Он не используется, кроме как увеличивать его значение? –

+0

хорошо также используется в ссылках Sex array -> dd [Sex [counter]] [(int) x [16]] ++; – Tilak

+0

ForEachWithIndex - функция пустоты. Как это может дать доход? –

Смежные вопросы