将C#lambda表达式转换为VB
在查看Fuzzy Date Time Picker Control in C# .NET? Piotr Czaapla对该问题的回答正是我所需要的。将C#lambda表达式转换为VB
不幸的是,我是一个VB.NET家伙,我不熟悉lambda表达式,所以我尝试转换代码导致了几个小时的错误的括号,并用砖块敲我的头。
任何机会一些双语向导可以将C#代码转换为VB.net给我吗?
下面的代码有问题:
class FuzzyDateTime
{
static List<string> dayList = new List<string>() { "sun", "mon", "tue", "wed", "thu", "fri", "sat" };
static List<IDateTimePattern> parsers = new List<IDateTimePattern>()
{
new RegexDateTimePattern (
@"next +([2-9]\d*) +months",
delegate (Match m) {
var val = int.Parse(m.Groups[1].Value);
return DateTime.Now.AddMonths(val);
}
),
new RegexDateTimePattern (
@"next +month",
delegate (Match m) {
return DateTime.Now.AddMonths(1);
}
),
new RegexDateTimePattern (
@"next +([2-9]\d*) +days",
delegate (Match m) {
var val = int.Parse(m.Groups[1].Value);
return DateTime.Now.AddDays(val);
}
),
new RegexDateTimePattern (
@"([2-9]\d*) +months +ago",
delegate (Match m) {
var val = int.Parse(m.Groups[1].Value);
return DateTime.Now.AddMonths(-val);
}
),
new RegexDateTimePattern (
@"([2-9]\d*) days +ago",
delegate (Match m) {
var val = int.Parse(m.Groups[1].Value);
return DateTime.Now.AddDays(-val);
}
),
new RegexDateTimePattern (
@"([2-9]\d*) *h(ours)? +ago",
delegate (Match m) {
var val = int.Parse(m.Groups[1].Value);
return DateTime.Now.AddMonths(-val);
}
),
new RegexDateTimePattern (
@"tomorrow",
delegate (Match m) {
return DateTime.Now.AddDays(1);
}
),
new RegexDateTimePattern (
@"today",
delegate (Match m) {
return DateTime.Now;
}
),
new RegexDateTimePattern (
@"yesterday",
delegate (Match m) {
return DateTime.Now.AddDays(-1);
}
),
new RegexDateTimePattern (
@"(last|next) *(year|month)",
delegate (Match m) {
int direction = (m.Groups[1].Value == "last")? -1 :1;
switch(m.Groups[2].Value)
{
case "year":
return new DateTime(DateTime.Now.Year+direction, 1,1);
case "month":
return new DateTime(DateTime.Now.Year, DateTime.Now.Month+direction, 1);
}
return DateTime.MinValue;
}
),
new RegexDateTimePattern (
String.Format(@"(last|next) *({0}).*", String.Join("|", dayList.ToArray())), //handle weekdays
delegate (Match m) {
var val = m.Groups[2].Value;
var direction = (m.Groups[1].Value == "last")? -1 :1;
var dayOfWeek = dayList.IndexOf(val.Substring(0,3));
if (dayOfWeek >= 0) {
var diff = direction*(dayOfWeek - (int)DateTime.Today.DayOfWeek);
if (diff <= 0) {
diff = 7 + diff;
}
return DateTime.Today.AddDays(direction * diff);
}
return DateTime.MinValue;
}
),
new RegexDateTimePattern (
@"(last|next) *(.+)", // to parse months using DateTime.TryParse
delegate (Match m) {
DateTime dt;
int direction = (m.Groups[1].Value == "last")? -1 :1;
var s = String.Format("{0} {1}",m.Groups[2].Value, DateTime.Now.Year + direction);
if (DateTime.TryParse(s, out dt)) {
return dt;
} else {
return DateTime.MinValue;
}
}
),
new RegexDateTimePattern (
@".*", //as final resort parse using DateTime.TryParse
delegate (Match m) {
DateTime dt;
var s = m.Groups[0].Value;
if (DateTime.TryParse(s, out dt)) {
return dt;
} else {
return DateTime.MinValue;
}
}
),
};
public static DateTime Parse(string text)
{
text = text.Trim().ToLower();
var dt = DateTime.Now;
foreach (var parser in parsers)
{
dt = parser.Parse(text);
if (dt != DateTime.MinValue)
break;
}
return dt;
}
}
interface IDateTimePattern
{
DateTime Parse(string text);
}
class RegexDateTimePattern : IDateTimePattern
{
public delegate DateTime Interpreter(Match m);
protected Regex regEx;
protected Interpreter inter;
public RegexDateTimePattern(string re, Interpreter inter)
{
this.regEx = new Regex(re);
this.inter = inter;
}
public DateTime Parse(string text)
{
var m = regEx.Match(text);
if (m.Success)
{
return inter(m);
}
return DateTime.MinValue;
}
}
OK,有一串代码在那里,我就不翻译了这一切,但例如(假设VS2010或更高版本)。 。 。
new RegexDateTimePattern (
@"next +([2-9]\d*) +months",
delegate (Match m) {
var val = int.Parse(m.Groups[1].Value);
return DateTime.Now.AddMonths(val);
}
)
将
Dim p2 = New RegexDateTimePattern(
"next +([2-9]\d*) +months",
Function(m)
Dim val = Int.Parse(m.Groups(1).Value)
Return DateTime.Now.AddMonths(val)
End Function
)
和
new RegexDateTimePattern (
String.Format(@"(last|next) *({0}).*", String.Join("|", dayList.ToArray())),
delegate (Match m) {
var val = m.Groups[2].Value;
var direction = (m.Groups[1].Value == "last")? -1 :1;
var dayOfWeek = dayList.IndexOf(val.Substring(0,3));
if (dayOfWeek >= 0) {
var diff = direction*(dayOfWeek - (int)DateTime.Today.DayOfWeek);
if (diff <= 0) {
diff = 7 + diff;
}
return DateTime.Today.AddDays(direction * diff);
}
return DateTime.MinValue;
}
),
变得
Dim p = New RegexDateTimePattern(
String.Format("(last|next) *({0}).*", String.Join("|", dayList.ToArray())),
Function(m)
Dim val = m.Groups(2).Value
Dim direction = If(m.Groups(1).Value = "last", -1, 1)
Dim dayOfWeek = dayList.IndexOf(val.Substring(0, 3))
If (dayOfWeek >= 0) Then
Dim diff = direction * (dayOfWeek - CType(DateTime.Today.DayOfWeek, Integer))
If (diff <= 0) Then
diff = 7 + diff
End If
Return DateTime.Today.AddDays(direction * diff)
End If
Return DateTime.MinValue
End Function
)
还有什么在那里蜿蜒的你梅隆?
如果不是VS2010(或者即使它不是你喜欢的lambda表达式),那么你所需要做的就是获取每个lambda表达式(VB代码中的“in line”函数) ,为每一个(例如RegexDateTimePattern_Helper2为最后一个)创建明确命名的功能,并通过AddressOf RegexDateTimePattern_Helper2
代替lambda表达式
即
Function RegexDateTimePattern_Helper2(Match m) as DateTime ''# Dreadful name
dim val = m.Groups[2].Value
dim direction = if(m.Groups(1).Value = "last", -1 ,1)
Dim dayOfWeek = dayList.IndexOf(Val.Substring(0, 3))
If (dayOfWeek >= 0) Then
Dim diff = direction * (dayOfWeek - CType(DateTime.Today.DayOfWeek, Integer))
If (diff <= 0) Then
diff = 7 + diff
End If
Return DateTime.Today.AddDays(direction * diff)
End If
Return DateTime.MinValue
End Function
。 。 。
New RegexDateTimePattern (
String.Format("(last|next) *({0}).*", String.Join("|", dayList.ToArray())),
AddressOf RegexDateTimePattern_Helper2)
FWIW我在你的文章中修复了vb.net的评论。现在它正确地结束了该行的注释,而不是继续几行。 '''#'修复它。 – mydogisbox 2012-03-23 14:05:19
@mydogisbox:塔朋友:) – 2012-03-23 14:24:08
这看起来像一个伟大的开始 - 让我摔跤几个小时,看看我是否有其他问题。再次感谢! – 2012-03-23 15:34:27
转换器here吐出这个代码编译块了(除去少数“做” S和一对夫妇的“变种” S后):
Imports System.Text.RegularExpressions
Class FuzzyDateTime
Shared dayList As New List(Of String)() From { _
"sun", _
"mon", _
"tue", _
"wed", _
"thu", _
"fri", _
"sat" _
}
Shared parsers As New List(Of IDateTimePattern)() From { _
New RegexDateTimePattern("next +([2-9]\d*) +months", Function(m As Match)
Dim val = Integer.Parse(m.Groups(1).Value)
Return DateTime.Now.AddMonths(val)
End Function), _
New RegexDateTimePattern("next +month", Function(m As Match) DateTime.Now.AddMonths(1)), _
New RegexDateTimePattern("next +([2-9]\d*) +days", Function(m As Match)
Dim val = Integer.Parse(m.Groups(1).Value)
Return DateTime.Now.AddDays(val)
End Function), _
New RegexDateTimePattern("([2-9]\d*) +months +ago", Function(m As Match)
Dim val = Integer.Parse(m.Groups(1).Value)
Return DateTime.Now.AddMonths(-val)
End Function), _
New RegexDateTimePattern("([2-9]\d*) days +ago", Function(m As Match)
Dim val = Integer.Parse(m.Groups(1).Value)
Return DateTime.Now.AddDays(-val)
End Function), _
New RegexDateTimePattern("([2-9]\d*) *h(ours)? +ago", Function(m As Match)
Dim val = Integer.Parse(m.Groups(1).Value)
Return DateTime.Now.AddMonths(-val)
End Function), _
New RegexDateTimePattern("tomorrow", Function(m As Match) DateTime.Now.AddDays(1)), _
New RegexDateTimePattern("today", Function(m As Match) DateTime.Now), _
New RegexDateTimePattern("yesterday", Function(m As Match) DateTime.Now.AddDays(-1)), _
New RegexDateTimePattern("(last|next) *(year|month)", Function(m As Match)
Dim direction As Integer = If((m.Groups(1).Value = "last"), -1, 1)
Select Case m.Groups(2).Value
Case "year"
Return New DateTime(DateTime.Now.Year + direction, 1, 1)
Case "month"
Return New DateTime(DateTime.Now.Year, DateTime.Now.Month + direction, 1)
End Select
Return DateTime.MinValue
''#handle weekdays
End Function), _
New RegexDateTimePattern([String].Format("(last|next) *({0}).*", [String].Join("|", dayList.ToArray())), Function(m As Match)
Dim val = m.Groups(2).Value
Dim direction = If((m.Groups(1).Value = "last"), -1, 1)
Dim dayOfWeek = dayList.IndexOf(val.Substring(0, 3))
If dayOfWeek >= 0 Then
Dim diff = direction * (dayOfWeek - CInt(DateTime.Today.DayOfWeek))
If diff <= 0 Then
diff = 7 + diff
End If
Return DateTime.Today.AddDays(direction * diff)
End If
Return DateTime.MinValue
''# to parse months using DateTime.TryParse
End Function), _
New RegexDateTimePattern("(last|next) *(.+)", Function(m As Match)
Dim dt As DateTime
Dim direction As Integer = If((m.Groups(1).Value = "last"), -1, 1)
Dim s = [String].Format("{0} {1}", m.Groups(2).Value, DateTime.Now.Year + direction)
If DateTime.TryParse(s, dt) Then
Return dt
Else
Return DateTime.MinValue
End If
''#as final resort parse using DateTime.TryParse
End Function), _
New RegexDateTimePattern(".*", Function(m As Match)
Dim dt As DateTime
Dim s = m.Groups(0).Value
If DateTime.TryParse(s, dt) Then
Return dt
Else
Return DateTime.MinValue
End If
End Function) _
}
Public Shared Function Parse(text As String) As DateTime
text = text.Trim().ToLower()
Dim dt = DateTime.Now
For Each parser In parsers
dt = parser.Parse(text)
If dt <> DateTime.MinValue Then
Exit For
End If
Next
Return dt
End Function
End Class
Interface IDateTimePattern
Function Parse(text As String) As DateTime
End Interface
Class RegexDateTimePattern
Implements IDateTimePattern
Public Delegate Function Interpreter(m As Match) As DateTime
Protected regEx As Regex
Protected inter As Interpreter
Public Sub New(re As String, inter As Interpreter)
Me.regEx = New Regex(re)
Me.inter = inter
End Sub
Public Function Parse(text As String) As DateTime Implements IDateTimePattern.Parse
Dim m = regEx.Match(text)
If m.Success Then
Return inter(m)
End If
Return DateTime.MinValue
End Function
End Class
我翻译一个模式,其余的东西。现在,你只需要添加其他模式(这不应该是一个大问题,它在模块1测试
Module Module1
Sub Main()
Dim res = FuzzyDateTime.Parse("next 2 months")
End Sub
End Module
Public Interface IDateTimePattern
Function Parse(text As String) As DateTime
End Interface
Public Class FuzzyDateTime
Shared dayList As List(Of String) = New List(Of String)() From {"sun", "mon", "tue", "wed", "thu", "fri", "sat"}
Shared parsers As List(Of IDateTimePattern) = New List(Of IDateTimePattern)()
Shared Sub New()
parsers.Add(New RegexDateTimePattern("next +([2-9]\d*) +months", New Func(Of Match, DateTime)(Function(x As Match)
Dim val = Integer.Parse(x.Groups(1).Value)
Return DateTime.Now.AddMonths(val)
End Function)))
End Sub
Public Shared Function Parse(ByVal text As String) As DateTime
text = text.Trim().ToLower()
Dim dt = DateTime.Now
For Each parser In parsers
dt = parser.Parse(text)
If Not dt = DateTime.MinValue Then
Exit For
End If
Next
Return dt
End Function
End Class
Public Class RegexDateTimePattern : Implements IDateTimePattern
Protected inter As Func(Of Match, DateTime)
Protected regEx As Regex
Public Function Parse(text As String) As Date Implements IDateTimePattern.Parse
Dim m = regEx.Match(text)
If m.Success Then Return inter(m)
Return DateTime.MinValue
End Function
Public Sub New(ByVal re As String, ByVal inter As Func(Of Match, DateTime))
Me.regEx = New Regex(re)
Me.inter = inter
End Sub
End Class
PS:我添加的图案在静态构造函数(加入他们你喜欢的地方,虽然)不能与内联初始化 - 它只是简单丑陋在我看来。
你有没有尝试过在线c#到vb.net转换工具,如http://converter.telerik.com/? – 2012-03-23 13:18:50
你为什么试图将它转换为vb?编译它在C#中,并引用程序集在您的VB项目。 – 2012-03-23 13:18:57
@Bala - 我曾尝试了几个C#转换为vb.net,但lambda表达式被弄坏了。 – 2012-03-23 13:21:11