2 Stimmen

Können Sie zip oder verwenden Sie eine benutzerdefinierte Join-Operator in nicht-Ausdruck linq?

Ich habe mehrere Sequenzen, die ich in einer besser lesbaren Weise zusammenfassen möchte, so dass ich schreiben könnte

a.Zip(b)

in der Abfragesyntax als

From a in Foo1
Join b in Foo2

ohne dass das Ergebnis eine Querverbindung ist

o

From a in Foo1
Zip b in Foo2

3voto

Tomas Petricek Punkte 233658

Die Norm Zip Methode ermöglicht es Ihnen, etwas wie (mit C#) zu schreiben:

from t in first.Zip(second, (f, s) => new { First = f, Second = s }
select ... t.First ... t.Second;

Ich denke, das sollte lesbar genug sein. Ihre Frage scheint darauf hinzudeuten, dass Sie gerne Ihr eigenes Schlüsselwort erstellen möchten, z. B. zip und erweitern Sie die C#-Abfrageausdrücke damit. Dies ist nicht möglich in C# oder Visual Basic (aber ich stimme zu, es wäre schön, in gewisser Weise).

Mit etwas Mühe können Sie neu definieren was das standardmäßige C#-Abfragekonstrukt tut, so dass join würde sich verhalten wie zip (In diesem Fall ist die equals Teil der Abfrage wäre nicht erforderlich, so dass man eine Menge syntaktisches Rauschen hätte). Möglicherweise könnten Sie auch umdefinieren, was from Klausel. Ich habe es nicht ausprobiert, aber ich glaube, man könnte so etwas bekommen:

from f in first.Zip()
from s in second.AddToZip()
from t in second.AddToZip()
select ... f ... s ... t ...;

Ich habe einen Artikel geschrieben, der beschreibt, wie man das macht Neudefinition von für die group by Klausel ( Verwendung des benutzerdefinierten Gruppierungsoperators in LINQ ), um Ihnen eine Vorstellung davon zu vermitteln, wie dies geschehen kann.

(Aber ehrlich gesagt glaube ich, dass der Standard Zip Methode sollte in Ordnung sein. Die Neudefinition der Operatoren ist recht subtil. Die group by Beispiel ist vielleicht ansprechender, weil die Gruppierung nach der Methode hässlicher ist, aber auch das ist grenzwertig...)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X