2012-12-27 10 views
5

Czy istnieje wyrażenie Linq, które zwraca indeks ostatniej niezerowej wartości w tablicy? Nie interesuje mnie rozszerzenie, tylko proste wyrażenie linq.Linq - Uzyskaj indeks ostatniej niezerowej liczby macierzy

Wyobrażam sobie coś takiego pseudo kod:

int index = {0, 2, 1}.LastOrDefaultAt(i => i > 0); 

Zwrócona wartość powinna wynosić 2;

Odpowiedz

7

Można użyć metody Array.FindLastIndex<T> dla tego:

int index = Array.FindLastIndex(myIntArray, item => item > 0); 

Zauważyłem, że można wymienić „niezerowe” zamiast „większy niż zero "w tekście pytania. Czy Twój predykat powinien być: item => item != 0?

+0

To właśnie odpowiedź szukałem. Dzięki. Pojawia się problem, dlaczego program Intellisense nie wyświetla FindLastIndex, jeśli wpisuję "myIntArray". - pokazuje wiele innych metod. Pokazuje się, gdy wpisuję "Array". – BSalita

+1

Ponieważ jest to metoda statyczna w klasie 'Array'; nie jest metodą instancji. – Ani

+0

Ah. Dzięki jeszcze raz. Wygląda na to, że Intellisense powinien dać twórcom wskazówkę, że dostępne są dodatkowe statyczne metody. Spędziłem kilka godzin nad czymś, co mogło pomóc IntelliSense. – BSalita

1

List<T> ma metodę rozszerzenia dla tego nazywa FindLastIndex

var index = new int[] { 0, 2, 1}.ToList().FindLastIndex(x => x > 0); 
0
class Program 
{ 
    static void Main(string[] args) 
    { 
     int[] index = { 0, 2, 1 }; 

     var query = from p in index 
        where p != 0 
        orderby p descending 
        select p; 

     Console.WriteLine(query.FirstOrDefault()); 
     Console.ReadKey(); 
    } 
} 

Wyjście: 2. Może być napisany w składni metody razie potrzeby:

var index = new int[] { 0, 2, 1 }.Where(a => a != 0).OrderByDescending(a => a).FirstOrDefault(); 
Powiązane problemy