2016-12-02 3 views
1

Ich versuche, einige meiner C# -Code in VB zu verschieben. Wenn ich den C# -Code über den Telerik-Übersetzer laufen lasse, spuckt er den folgenden VB-Code aus. Der VB-Code wird nicht kompiliert und gibt einen Fehler im Abschnitt "a.Remove()". Der Fehler istVergleich der C# Linq-Syntax -VS- VB Linq-Syntax

„Expression keinen Wert erzeugen“ Was ist der richtige Code, um das „Drehbuch“ und „a“ Tags zu entfernen wäre, so dass der VB-Code die gleichen wie die C# funktioniert Code?

Mein ursprünglicher C# -Code:

public static HtmlDocument RemoveUselessTags(HtmlDocument doc) 
    { 
     doc.DocumentNode.Descendants() 
      .Where(a => a.Name == "script" || a.Name == "a") 
      .ToList() 
      .ForEach(a => a.Remove()); 
     return doc; 
    } 

Mein "übersetzt" VB-Code:

Public Shared Function RemoveUselessTags(doc As HtmlDocument) As HtmlDocument 
     doc.DocumentNode.Descendants() 
      .Where(Function(a) a.Name = "script" OrElse a.Name = "a") 
      .ToList() 
      .ForEach(Function(a) a.Remove()) 
     Return doc 
    End Function 
+3

Verwenden Sie einfach eine echte "foreach" -Schleife an erster Stelle (in beiden Sprachen). Es verbessert die Lesbarkeit des Codes, entfernt unnötige Komplikationen in der Syntax (wie zum Beispiel die spezielle, die Sie stolpern ließen) und verbessert die Leistung (der Speicherbedarf geht von O (n) nach O (1) nicht ganz unnötig) Erstellen einer Liste, die Sie nie verwenden und alle Elemente darin speichern). – Servy

+0

Die Übersetzung des Codes ist perfekt, außer "OrElse" sollte "Or" sein. – jdweng

+1

@jdweng - Nein, 'OrElse' ist das VB-Äquivalent des Kurzschließers' || 'in C#. –

Antwort

4

Das Problem ist, dass Sie Function verwenden, was für Dinge sind, die einen Wert zurückgeben. Sie sollten in der Lage sein zu verwenden:

ForEach(Sub(a) a.Remove())