2016-04-21 7 views
-1

Ich möchte auf die Zeilennummer in Linq Abfrage zugreifen. Es gibt viele Artikel im Internet, die erklären, wie man das macht, aber es gibt einen Haken: Ich möchte die Aufzählung "später" auflösen und ich möchte, dass es jedes Mal die gleiche ID zuweist. Aus diesem Grunde Methoden wie diese funktionieren nicht:Assing eine sequentielle "Zeilennummer" in linq Ausgabe

public IEnumerable<MyClass> GetThings(List<object> lst) 
{ 
    int ID=0; 
    return from i in lst 
     select new MyClass(ID++, i); 
} 
public class MyClass 
{ 
    public MyClass(int ID, object Stuff) 
    { ... } 
} 
... 
    var x = GetThings(SomeList); 

(schlägt fehl, weil jedes Mal, wenn x lösen, indem jedes Element iteriert eine andere ID bekommt)

+0

Wie hast du die Frage und die Antwort zur gleichen Zeit (auch Sekunden sind gleich)? – fubo

+0

@fubo gibt es ein Kontrollkästchen an der Unterseite, wenn Sie die Frage stellen :) – DJL

+1

Dank bemerkte nicht, dass alle Jahre – fubo

Antwort

1

Eigentlich können Sie die Select Überlastung verwenden Das passiert auch den Index, so etwas wie folgt:

lst.Select((o, i) => new MyClass(i, o)); 
+0

Eigentlich bei näherer Betrachtung könnte ich diese kürzere Lösung auch in meiner realen Anwendung anwenden. Nett :) – DJL

1

Stellt sich heraus, die Lösung dieses Problem ist ganz einfach - greifen Sie auf die Zeilennummer der Quellensammlung und nicht auf die Ausgabesammlung. Offensichtlich funktioniert das nur, wenn Sie nicht filtern usw. und die Anzahl der Elemente in Ihrer Ausgabesammlung die gleiche wie die Eingabesammlung ist. Es sei denn, Sie mit Lücken in Ordnung sind und/oder dupliziert

dh

public IEnumerable<MyClass> GetThings(List<object> lst) 
{ 
    int ID=0; 
    return from i in lst.Select((item,id)=>new {Item=item, ID=id}) 
     select new MyClass(i.ID, i.Item); 
} 
public class MyClass 
{ 
    public MyClass(int ID, object Stuff) 
    { ... } 
} 
... 
    var x = GetThings(SomeList); 

jetzt die IDs der einzelnen Elemente in x die gleiche iterieren jedes Mal, wenn Sie es