2009-06-05 11 views
6

Ich habe eine IEnumerable Liste von Objekten in C#. Ich kann ein für jedes verwenden, um jedes Objekt zu durchlaufen und zu untersuchen, aber in diesem Fall möchte ich nur das erste Objekt untersuchen, ohne eine foreach-Schleife zu benutzen.C# IEnumerable Abrufen des ersten Datensatzes

Ich habe versucht, meine Liste [0], aber das hat nicht funktioniert.

Dank

Antwort

22

(Aus Gründen der Bequemlichkeit, diese Antwort übernimmt myList implementiert IEnumerable<string>;. string mit dem entsprechenden Typ gegebenenfalls ersetzen)

Wenn Sie .NET 3.5, verwenden Sie die First() Erweiterung mit Methode:

string first = myList.First(); 

Wenn Sie nicht sicher sind, ob irgendwelche Werte sind oder nicht, können Sie die FirstOrDefault() Methode verwenden, die zurückkehren null (oder allgemeiner der Standardwert des Elementtyps) für eine leere Sequenz.

Sie es immer noch tun können, „der lange Weg“ ohne foreach Schleife:

using (IEnumerator<string> iterator = myList.GetEnumerator()) 
{ 
    if (!iterator.MoveNext()) 
    { 
     throw new WhateverException("Empty list!"); 
    } 
    string first = iterator.Current; 
} 

Es ist ziemlich obwohl hässlich :)

In Antwort auf Ihren Kommentar, nein, ist die zurückgegebene Iterator nicht zuerst am ersten Element positioniert; Es ist vor das erste Element positioniert. Sie müssen MoveNext() aufrufen, um es zum ersten Element zu verschieben, und so können Sie den Unterschied zwischen einer leeren Sequenz und einer mit einem einzelnen Element feststellen.

EDIT: Ich denke nur darüber nach, ob das ein ist nützliche Erweiterungsmethode:

public static bool TryFirst(this IEnumerable<T> source, out T value) 
{ 
    using (IEnumerator<T> iterator = source.GetEnumerator()) 
    { 
     if (!iterator.MoveNext()) 
     { 
      value = default(T); 
      return false; 
     } 
     value = iterator.Current; 
     return true; 
    } 
} 
+0

Ist mylist.GetEnumerator() Strom gleich dieser.? Ich möchte es nur wissen, um es zu wissen. –

+0

Ich bin mir nicht sicher, ob ich die Extension-Methode mag, da ihr Out-Parameter es weniger zusammensetzbar macht. Ich weiß, das ist der Sinn der Methode in diesem Fall, aber etwas, das in einer Sequenz nicht zusammensetzbar ist, scheint falsch zu sein. –

+0

Das Ergebnis davon ist jedoch keine Sequenz - es wird immer nur ein einzelnes Element und ein Boolescher Wert sein, also müsste es sowieso am Ende der Kompositionskette sein. Ich denke, wenn man sich die Orte ansieht, wo man das wirklich möchte, ist das kein Problem. Wie Sie sagen, ist es der Punkt der Methode. –

3

Denken Sie daran, dass es möglicherweise kein "erstes Element" gibt, wenn die Sequenz leer ist.

 IEnumerable<int> z = new List<int>(); 
     int y = z.FirstOrDefault(); 
+0

Um FirstOrDefault() zu verwenden, müssen Sie "using System.Linq;" deklarieren. – Tony

2

Wenn Sie nicht auf 3.5 sind:

using (IEnumerator<Type> ie = ((IEnumerable<Type>)myList).GetEnumerator()) { 
    if (ie.MoveNext()) 
     value = ie.Current; 
    else 
     // doesn't exist... 
} 

oder

Type value = null; 
foreach(Type t in myList) { 
    value = t; 
    break; 
} 
Verwandte Themen