2013-07-15 3 views
6

Vor einiger Zeit habe ich an einem ziemlich verdrehten Projekt gearbeitet - ich konnte den Code nur in den einzelnen Bereich schreiben und er würde später in eine C# -Funktion (von einem anderen Modul) eingefügt werden.Ist es möglich, Linq und Lambdas ohne einen System.Linq-Namespace zu verwenden?

ich nur Namespaces, die vor deklariert wurden verwenden könnte (ich auf sie keinen Einfluss hatte) und nur Variablen vom Umfang nutzen konnte ich gearbeitet. Aus diesem Grund war ich nicht in der Lage die Header zu ändern und enthalten Bibliotheken .

Das Problem kam, wenn ich auf generische Sammlungen arbeiten wollte - ich konnte weder Lambda-Ausdrücke noch LINQ verwenden - ich war einfach nicht in der Lage, using System.Linq; zu setzen, da ich keinen Zugriff auf den Dateiheader hatte.

Ich musste nur eine einfache Sache tun und es war einfach, ohne LINQ oder Lambda zu verwalten. Danach habe ich mich gefragt, was passieren würde, wenn ich komplexere Operationen auf IEnumerable mit durchführen müsste. Daraus kommt meine Frage:

Ist es möglich, LINQ oder Lambdas zu verwenden, ohne den Dateiheader zu ändern und neue Namespaces hinzuzufügen?

Nehmen wir an, wir haben eine List<int> _Numbers = new List<int>();. Lass es mit einigen Zahlen gefüllt werden. Jetzt möchte ich alle geraden Zahlen daraus auswählen.

Mit using System.Linq; im Header ist die Lösung auf der Hand:

List<int> _NewList = _Numbers.Where(n => n % 2 == 0).ToList(); 

oder

List<int> _NewList = (from _Number in _Numbers where _Number % 2 == 0 select _Number).ToList(); 

Aber ohne LINQ enthalten, wie kann ich das erreichen? Meine erste Vermutung wäre so etwas wie:

List<int> _NewList = System.Linq. // ??? What to add here? 

Ich bin mir bewusst, dass das Problem eher exotisch ist, und es ist sehr ungewöhnlich, diesen Weg zu gehen, aber ich bin nur neugierig, und ich habe keine Informationen darüber gefunden Fall.

+1

'System.Linq.Enumerable.Where (_NeueListe, n => n% 2 == 0)' –

+0

@nsinreal - danke, das ist genau das, was ich gesucht habe. Fügen Sie das als Antwort hinzu und ich werde es als korrekt markieren;) –

+0

Sie können auch 'using'-Anweisungen in die Namespace-Deklaration einer Klasse aufnehmen. Ist das noch außerhalb des Bereichs, auf den Sie Zugriff haben? – Sam

Antwort

15

Ohne die using Direktive werden Methoden wie .Where, .Select, nicht aufgelöst. Das bedeutet, dass LINQ die Sprache Teil wird nicht funktionieren. Sie würden es lange Hand kodieren (und rückwärts!):

List<int> _NewList = System.Linq.Enumerable.ToList(
    System.Linq.Enumerable.Where(_Numbers, _Number => _Number % 2 == 0) 
); 

Beachten Sie, dass diese für längere Beispiele mit Gruppen, Aufträge zu erhöhen komplexer wird, „let“ s, verbindet usw. Wenn Sie etwas tun, ziemlich einfach, wäre es ratsam, nur einen Weg finden, die using Richtlinie hinzuzufügen.

Beachten Sie jedoch, dass, wenn _Numbers ein List<T> ist, können Sie einfach verwenden (für dieses einzelne Beispiel):

List<int> _NewList = _Numbers.FindAll(_Number => _Number % 2 == 0); 
+0

Danke, es hat viel erklärt. Ich weiß von FindAll(), aber soweit ich weiß, funktioniert es nur mit List und ich suchte nach einem universelleren Weg. –

2

nicht ganz klar, warum Sie können nicht Datei „Header“ zugreifen, aber wenn das Problem, das Sie nicht in dem Anfang der Datei using dirrective eingeben können, Sie können noch voll qualifizierten Namen des Typs zu verwenden, wie:

System.Linq.Enumerable(...) 

Damit dies funktioniert, müssen Sie natürlich auch korrekte Referenzen angeben.

Wenn dies nicht das, was Sie für Fragen, bitte klären.

+1

Ich konnte nicht auf den Dateikopf zugreifen, das war das Problem des APi, mit dem ich arbeitete. Ich weiß, dass ich System.Linq hinzufügen könnte. im Umfang, aber ich wusste nicht, wie man es weiter auswertet. –

3

können Sie einen solchen Code schreiben:

System.Linq.Enumerable.Where(_NewList, n => n % 2 == 0) 

Doch Vorsicht : Wenn Ihre Klasse die Schnittstelle IQueryable<T> implementiert, wird der obige Code die Arbeit erledigen, aber langsamer.

System.Linq.Queryable.Where(_NewList, n => n % 2 == 0) 

Da IQueryable ist die Art und Weise C# in anderer DSL-Sprache, wie SQL zu erzeugen. Mit anderen where Bedingungen kann Ihr SQL-Server benötigte Elemente so schnell wie möglich auswählen. Aber wenn du mit IEnumerable oder System.Linq.Enumerable arbeitest, sollte es auf der Serverseite nicht optimiert werden, du wirst eine vollständige Liste von Elementen bekommen, die alle in den Speicher geladen und im Speicher gefiltert werden.

Verwandte Themen