LINQ Problem

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    LINQ Problem

    Hi,

    Ich habe diese Funktion, welche auch gut Funktioniert:

    Public Function GetAllConnections() As IEnumerable(Of Connection)
    Return GetAllTcpConnections.Concat(GetAllUdpConnections) _
    .OrderBy(Function(Conn) Conn.Proto) _
    .ThenBy(Function(Conn) Conn.State)
    End Function

    Allerdings benötigt sie Linq welches erst in Framework 3.5 unterstützt wird.
    Ich muss das ganze aber in 2.0 zum laufen bekommen.
    Wie kann ich das tun?

    Die Klasse Connection enthält mehrere Properties und GetAllTcpConnections returned eine List of (Connection)
    C# Developer
    Learning C++
    Dann verwende halt kein LINQ... List.Sort sollte helfen.

    EDIT: Alternativ kannst du auch LINQBridge nutzen.
    Und es kann gute Gründe geben, .net 2.0 zu unterstützen. Vor allem wenn man die Zielplattform nicht beeinflussen kann und dort halt nur die 2er Version drauf ist. Diversen Statistiken nach, läuft XP auch noch auf 20-25% aller Rechner...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „3daycliff“ ()

    2.0 braucht niemand mehr. Wenn Du XP willst, dann nimm 3.5.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @Trade
    Lass ihn doch so machen wie er will. Wenn er Rücksicht auf .NET FW 2.0-Nutzer nehmen will, dann ist das doch gut.

    @Topic
    Du könntest auch den Code der Linq-Funktionen raussuchen und dann einfach diesen verwenden. Ansonsten halt selber machen, sehr schwer ist das ja auch nicht.

    nafets3646 schrieb:

    @Trade
    Lass ihn doch so machen wie er will. Wenn er Rücksicht auf .NET FW 2.0-Nutzer nehmen will, dann ist das doch gut.

    Nicht unbedingt. Es gibt einfach irgendwann eine Grenze. Bei Windows XP ist diese spätestens dann erreicht wenn der Support ausläuft.
    Außerdem kann man es einem Benutzer durchaus zumuten .NET zu installieren. Die ganze Java-Scheiße benötigt auch eine Installation. Da sagt niemand was. Es gibt bei neueren Versionen nun mal neue, tolle Features. Weshalb diese also nicht nutzen? Ich denke, dass .NET 3.5 in Zeiten von .NET 4.5 nicht zu viel verlangt wäre.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    also ich frag auch warum.
    Weil vlt. liegt der Grund ja in einem anneren Problem, was man lösen könnte, und dann wären höhere Frameworks ja wieder verfügbar.

    Ansonsten musst du halt selbst 2 Listen zusammenfügen, und dann sortieren.
    Fürs Sortieren brauchst du eine eigene Comparer-Klasse, die IComparer(Of T) unterstützt, oder zumindes brauchst du eine Comparison(Of T).

    Vorgeführt hab ich solch mal in Sort and Search
    Ja, ich möchtee gerne das das Programm auch für 2.0 Nutzer nutzbar ist, daher kein Linq. Ich habe versucht die LINQ Funktion so umzuschreiben:

    Aber irgendwas mach ich falsch den VB schmeisst mir zur Laufzeit diesen Fehler ins Gesicht:

    Was mache ich falsch?
    C# Developer
    Learning C++
    @ErfinderDesRades:

    Ich habe jetzt in der Klasse

    Quellcode

    1. Implements IComparer(Of Connection)

    implementiert, wobei VB folgendes bemängelt:

    Class 'IPHelper' must implement 'Function Compare(x As TrafficViewer.IPHelper.Connection, y As TrafficViewer.IPHelper.Connection) As Integer' for interface 'System.Collections.Generic.IComparer(Of Connection)'.

    Und ich habe versucht es so aufzurufen:

    Quellcode

    1. Public Function GetAllConnections() As IEnumerable(Of Connection) Implements IComparer(Of Connection).Compare
    2. Dim Conn As New List(Of Connection)
    3. Conn.AddRange(GetAllUdpConnections)
    4. Array.Sort(Conn.ToArray)
    5. Return Conn
    6. End Function


    Hier meldet VB:
    'GetAllConnections' cannot implement 'Compare' because there is no matching function on interface 'System.Collections.Generic.IComparer(Of Connection)'.

    Der komplette Code von meinem Programm sieht übrigens so aus: http://forum.masterdrive.it/visual-basic-net-18/getextendedtcptable-getextendedudptable-50739/

    @3daycliff :
    Nein, ich möchte keine Linq-Bridge verwenden.
    Ich habe mir den MSDN Artikel angeschaut, versuche ihn gerade zu verstehen...
    C# Developer
    Learning C++

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rikudo“ ()

    Mir scheint, als hättest Du den Sinn von Interfaces noch nicht ganz verstanden. Du musst Compare als eigene Funktion aufrufen, zumindest sollte das hier so sein, denn das Interface schreibt Dir das vor, dass dies explizit aufgerufen werden muss.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    du must natürlich auch die richtige Sort-Überladung nehmen, die einen IComparer ühaupt entgegennimmt.
    Ach - ist doch nur wirres Rumgewurstel - oder hat jemand gesagt, GetallConnections müsste auch iwas implementieren?

    Hast du eiglich mal mein verlinktes Tut angeguckt?

    Übrigens versuch mal, Code richtig mittm Code-Tag einzufügen.
    Guck dir einfach mal an wie Interfaces funktionieren,
    Musst in der Klasse Connection IComparable(of Connection) implementieren und die Vergleichslogik selbst implementieren.
    Dann kurz googlen was zurückgegeben werden muss für True bzw false (sind -1 und 0)

    Hier mal ne Hilfe:

    VB.NET-Quellcode

    1. Public Class Test
    2. Implements IComparable(Of Test)
    3. Public Property input As Integer
    4. Public Function CompareTo(other As Test) As Integer Implements IComparable(Of Test).CompareTo
    5. If Me.input < other.input Then
    6. Return -1
    7. Else
    8. Return 0
    9. End If
    10. End Function
    11. End Class
    12. ...
    13. Dim x As New List(Of Test) From {New Test With {.input = 0}, New Test With {.input = -4}}
    14. x.Sort()
    15. For Each item In x
    16. MessageBox.Show(item.input.ToString())
    17. Next
    18. ...

    Beachte, dass das genau nicht mein Ansatz ist.
    Aber egal, wird einfacher sein, weil da braucht er nicht die spezifische Überladung raussuchen - was ja nicht einfach ist, wenn man nicht weiß, was eine Überladung ist, und wie man die zB im Objectbrowser sucht.

    Der IComparer-Ansatz ist die genaue Entsprechung von Linq - bei Linq muss man ja auch nicht an der zu sortierenden Klasse selbst noch was dranproggen.
    Ahso du meintest das so:

    VB.NET-Quellcode

    1. Public Class Comparer
    2. Implements IComparer(Of Test)
    3. Public Function Compare(x As Test, y As Test) As Integer Implements IComparer(Of Test).Compare
    4. If x.input < y.input Then
    5. Return -1
    6. Else
    7. Return 0
    8. End If
    9. End Function
    10. End Class
    11. Public Class Test
    12. Public Property input As Integer
    13. End Class
    14. Dim x As New List(Of Test) From {New Test With {.input = 0}, New Test With {.input = -4}}
    15. x.Sort(New Comparer)
    16. For Each item In x
    17. MessageBox.Show(item.input.ToString())
    18. Next


    geht ja beides.