Predicate(Of T) in VB.NET

Dey

Banned
Registriert
Mai 2005
Beiträge
1.925
Hey.

Da ich aufgrund meiner neuen Arbeitsstelle in Zukunft nur noch VB.NET machen muss, möchte ich auf diesem Gebiet wieder richtig fit werden. Früher habe ich zwar mit VB angefangen, habe dann aber einige Zeit ausschließlich C# programmiert.

Inzwischen sind ja anonyme Methoden auch unter VB möglich. Das folgende Beispiel stellt einen sehr eleganten Code dar, den ich gerne auf dieselbe Weise in VB implementieren möchte. Kann mir ein erfahrener VB-Programmierer helfen, dies zu übersetzen?

PHP:
static Predicate<Car> ByYear(int year)
{
    return delegate(Car car)
    {
        return car.Year == year;
    };
}

static void Main(string[] args)
{
    // yeah, this bit is C# 3.0, but ignore it - it's just setting up the list.
    List<Car> list = new List<Car>
    {
        new Car { Year = 1940 },
        new Car { Year = 1965 },
        new Car { Year = 1973 },
        new Car { Year = 1999 }
    };
    var car99 = list.Find(ByYear(1999));
    var car65 = list.Find(ByYear(1965));

    Console.WriteLine(car99.Year);
    Console.WriteLine(car65.Year);
}
 
Private Shared Function ByYear(year As Integer) As Predicate(Of Car)
Return Function(car As Car) car.Year = year
End Function

Private Shared Sub Main(args As String())
' yeah, this bit is C# 3.0, but ignore it - it's just setting up the list.
Dim list As New List(Of Car)() From { _
New Car() With { _
Key .Year = 1940 _
}, _
New Car() With { _
Key .Year = 1965 _
}, _
New Car() With { _
Key .Year = 1973 _
}, _
New Car() With { _
Key .Year = 1999 _
} _
}
Dim car99 = list.Find(ByYear(1999))
Dim car65 = list.Find(ByYear(1965))

Console.WriteLine(car99.Year)
Console.WriteLine(car65.Year)
End Sub

http://www.developerfusion.com/tools/convert/csharp-to-vb/
Hab ich früher öfters benutzt um C# in VB.Net umzuwandeln...
Hat eig. immer einigermassen gut funktioniert...
 
Hallo Dey,

ich weiß nicht ob dir das direkt weiterhilft aber versuch es mal mit diesem C# to VB.NET Übersetzer:
http://www.developerfusion.com/tools/convert/csharp-to-vb/

Ich selbst stehe vor einem ähnlichen Problem, aber der Umstieg erfolgt bei mir genau anders herum, nämlich von VB.Net zu C#. Dazu habe ich schon einige mal den oben besagten Übersetzer verwendet. Das hat eigentlich auch immer einwandfrei geklappt.
Das liegt wohl auch daran, das C# und VB.NET logischerweise die gleichen Klassen usw. verwänden (ist ja das gleiche Framework ^^) bzw. sich eigentlich nur syntaktisch unterscheiden aber nicht semantisch. Daher ist es eigentlich auch klar, das es einen solchen Übersetzer gibt und das auch im Prinzip ganz gut klappt.

Hier der vom Übersetzer übersetze Code:
Code:
Private Shared Function ByYear(year As Integer) As Predicate(Of Car)
	Return Function(car As Car) car.Year = year
End Function

Private Shared Sub Main(args As String())
	' yeah, this bit is C# 3.0, but ignore it - it's just setting up the list.
	Dim list As New List(Of Car)() From { _
		New Car() With { _
			Key .Year = 1940 _
		}, _
		New Car() With { _
			Key .Year = 1965 _
		}, _
		New Car() With { _
			Key .Year = 1973 _
		}, _
		New Car() With { _
			Key .Year = 1999 _
		} _
	}
	Dim car99 = list.Find(ByYear(1999))
	Dim car65 = list.Find(ByYear(1965))

	Console.WriteLine(car99.Year)
	Console.WriteLine(car65.Year)
End Sub

Edit: Ok, da war wohl jemand schneller... ^^
 
Fantastisch. Das funktioniert einwandfrei :):):)

Bevor der Einwand kommt, dass ich hätte googlen sollen: Ich habe gegooglet, jedoch habe ich kein passendes Beispiel gefunden, da die meisten Beispiele auf C# basieren.

Vielen Vielen Dank euch beiden!
 
Hat einer von euch vielleicht ein Codebeispiel, wie die Find-Methode in einer Collection umgesetzt ist, sodass man ihr einen beliebigen Delegaten zur Verfügung stellen kann, welcher die Fallunterscheidung bei der Suche nach einem bestimmten Objekt durchführt.
 
Code:
public T Find( Predicate<T> match ) { 
	if( match == null ) 
	{ 
		ThrowHelper.ThrowArgumentNullException( ExceptionArgument.match );
	}
	Contract.EndContractBlock();

	for( int i = 0; i < _size; i++ ) 
	{
		if( match( _items[i] ) ) 
		{ 
			return _items[i];
		} 
	} 
	
	return default( T );
}
 
Zurück
Oben