2010-09-13 9 views
29

Ich habeLINQ - Auswählen zweite Element in IEnumerable

string[] pkgratio= "1:2:6".Split(':');

var items = pkgratio.OrderByDescending(x => x); 

ich den mittleren Wert auswählen wollen und haben mit diesem kommen. Ist dies eine korrekte Methode, um den zweiten Wert in einem IEnumberable auszuwählen?

pkgratio.Skip(1).Take(1).First(); 
+0

im Zusammenhang mit meiner allerersten Frage: http://StackOverflow.com/Questions/1735146/Ways-To-get-the-Middle-of-Alist-in-Haskell –

+0

Mit 'First()' impliziert Sie sind zuversichtlich, dass ein Gegenstand tatsächlich an der Position ist, auf die Sie zugreifen möchten. Wenn Zweifel bestehen, können Sie 'FirstOrDefault()' verwenden. –

+3

Sie brauchen nicht die Take (1) –

Antwort

61

Während das, was Sie Werke haben, die einfachste Art und Weise wäre der Index des Arrays zu verwenden und das zweite Element verweisen (bei Index 1, da der Index für das erste Element bei Null beginnt): pkgratio[1]

Console.WriteLine(pkgratio[1]); 

Ein vollständigeres Beispiel:

string[] pkgratio = "1:2:6".Split(':'); 

for (int i = 0; i < pkgratio.Length; i++) 
    Console.WriteLine(pkgratio[i]); 

Mit einem IEnumerable<T>, was Sie funktioniert haben, oder Sie können direkt das Element erhalten mit die ElementAt method:

// same idea, zero index applies here too 
var elem = result.ElementAt(1); 

Hier ist Ihre Probe als IEnumerable<string>. Beachten Sie, dass der Aufruf AsEnumerable() die Stichprobe gegen eine IEnumerable<string> hervorheben soll. Sie können ElementAt gegen das string[] Array Ergebnis von Split tatsächlich verwenden, aber es ist effizienter, den Indexer zu verwenden, der zuvor gezeigt wird.

var pkgratio = "1:2:6".Split(':').AsEnumerable(); 
Console.WriteLine(pkgratio.ElementAt(1)); 
+0

Arbeitet mit Linq seit Jahren, und habe noch nie ElementAt() verwendet. Beschäftigt schreiben einige Tests und brauchte es. Große einfache Antwort –

+2

Das gleiche hier +1 für das ElementAt, jetzt auch ElementAtOrDefault verwenden – jolySoft

15

pkgratio.ElementAt(1); für Ihr Szenario.

Allerdings ist Ihre Methode nur anwendbar, wenn Sie einige Daten wurden unter Verwendung, die IQueryable implementiert oder Sie benötigen bei einem bestimmten Index zB eine Reihe von Elementen, Rechnung zu tragen:

pkgratio.Skip(5).Take(10);

21

Ich glaube nicht, Sie müssen .Take(1).

pkgratio.Skip(1).First() 
5

Aber in diesem Fall, dass Sie ein Array, so dass Sie ziemlich glücklich das zweite Element mit bekommen:

pkgratio[1] 
9

Nun, die Take(1) nicht unbedingt erforderlich ist, wenn du gehst, nur zu First() es, so könnte ich mit

pkgratio.Skip(1).First(); 

gehen jedoch, dass First() eine Ausnahme ausgelöst wird, wenn kein Wert, also Sieversuchen möchten vielleichtund dann auf Null prüfen.

Verwandte Themen