2010-10-29 14 views
16

Esiste la possibilità di scrivere questo utilizzando il linguaggio di query ... non la catena del metodo?Come usare index/position con Where in LINQ query language?

notifications.Where((n, index) => n.EventId == m_lastSelectedEventID) 
       .Select((n, index) => new {Position = index}).FirstOrDefault(); 

Grazie, Radu

+1

Perché? Inoltre, sembra molto simile all'output di 'AnonymousClass1 {Position = 1}' o 'NULL' – cjk

+0

Possibile duplicato di [Esiste una sintassi LINQ per i sovraccarichi (T, int) di Where and Select?] (Http: // stackoverflow.com/questions/3757814/is-there-a-linq-syntax-for-the-t-int-overloads-of-where-and-select) –

risposta

33

No, la sintassi delle espressioni di query non ha il supporto per quei sovraccarichi ho paura.

D'altra parte, se si utilizza la Selezione di sovraccarico esplicitamente volta alla partenza per creare un tipo anonimo con l'indice e il valore in, è possibile quindi utilizzare tale sequenza di coppie all'interno di un'espressione di query. Per esempio:

var query = from pair in sequence.Select((value, index) => new { value, index }) 
      where pair.index % 3 == 0 
      select string.Format("{0}: {1}", pair.index, pair.value); 

EDIT: Si noti che nel codice di esempio, si sta sempre di filtraggio e poi prendendo l'indice della prima voce risultato sequenza. Tale indice sarà sempre 0. Se si desidera trovare in realtà l'originale indice della ID selezionato all'interno notifications, ti ho il sospetto che davvero voglia:

int? index = notifications.Select((n, index) => new { n, index }) 
          .Where(pair => pair.n.EventId == m_lastSelectedEventID) 
          .Select(pair => (int?) pair.index) 
          .FirstOrDefault(); 

(che restituirà un Nullable<int> di null se non trovato.)

+0

Avete qualche idea sulle prestazioni se invertite dove e selezionare? C'è qualche differenza? –

+0

@Radu: Beh, fornirà risultati * diversi * oltre a qualsiasi altra cosa. Modificherò la mia domanda per spiegare. –

+0

Thnaks ... ottima osservazione :) –