برای اینکه موضوع روشن بشه بیشتر توضیح می دم:
1- با زدن کلید Space از صفحه کلید کلمه ای که کاربر نوشته قبل از درج فاصله در متن چک می شه که در اینجا از تابع LastWord استفاده شده یعنی آخرین کلمه از کل متن: و همچنین متغیر QueryText یک رشته است که کل متن رو در بر می گیره و LastWord d یک Extension Method برای String هست.
Select Case Key.Key
Case ConsoleKey.Spacebar
LastWord = QueryText.LastWord
CurrentPos = Console.CursorLeft
If ISKeyWord(LastWord) = True Then
Console.CursorLeft = (CurrentPos - LastWord.Length)
Console.ForegroundColor = ConsoleColor.Blue
Console.Write("{0}", LastWord)
Console.ResetColor()
End If
End Select
2- این هم تابع LastWord که آخرین کلمه از متن رو برمی گردونه:
<Extension()> Function LastWord(str As String) As String
If str.EndsWith(Space(1)) = True Then Return ""
Dim spl() As String = str.Split(Space(1))
If spl.Length > 0 Then
Return spl(spl.Length - 1)
End If
Return ""
End Function
3- بعد از گرفتن آخرین کلمه از متن با تابع ISKeyWord چک می کنیم که این کلمه در کلمات کلیدی وجود داره یا نه اگر وجود داشته مقدار True رو بر می گردونه و چیزی که خواسته دیگه از این تابع هست برگردوندن مقدار اصلی کلمه کلیدی که در آرایه قرار داره برای همین هم متغیر LastWord که به ورودی تابع ISKeyWord داده شده از ونجایی که این ورودی ByRef تعریف شده مقدارش در خود تابع IsKeyWord تغییر می کنه چرا که باید جایگزین کلمه آخر از متن بشه و نحوه نوشتاری اون به شکل کلمه کلیدی اصلی زبان مورد نظر بشه و مطمئنا رنگ هم بگیره البته این در کنسول اپ هست (به فرض مثال SQL.)
Select Case Key.Key
Case ConsoleKey.Spacebar
LastWord = QueryText.LastWord
CurrentPos = Console.CursorLeft
If ISKeyWord(LastWord) = True Then
Console.CursorLeft = (CurrentPos - LastWord.Length)
Console.ForegroundColor = ConsoleColor.Blue
Console.Write("{0}", LastWord)
Console.ResetColor()
End If
End Select
Console.Write(Key.KeyChar)
QueryText += Key.KeyChar
GoTo ReadKey
4- این هم تابع ISKeyWord که از دستور LINQ برای جستجوی کلمه در لیست استفاده می کنه که بنظرم همون حلقه fOR Each...Next ساده تر از این باشه:
Function ISKeyWord(ByRef Value As String) As Boolean
Dim KeyWords() As String = {"FROM", "AS", "WHERE", "IS", "SELECT", "ALL"}
Dim MyWord As String = Value
Dim Words = From Word In KeyWords Where String.Compare(Word, MyWord, True) = 0
If Words.Count > 0 Then
Value = Words.First
Return True
End If
Return False
End Function
مشکلی که کد من داشت و نمی تونستم از linq استفاده کنم این بود که حواسم به نسخه dotnet نبود و ریفرنس linq رو اضافه نکرده بودم.
و مهم برای من مقدار دادن به ورودی Value هم بود با وجود اینکه می خواستم کدش ساده تر باشه اما بنظر همون حلقه For Each...Next بهتر بود.
Function ISKeyWord(ByRef Value As String) As Boolean
Dim KeyWords() = {"FROM", "AS", "WHERE", "IS", "SELECT", "ALL"}
For Each Word As String In KeyWords
If Value.ToUpper.CompareTo(Word) = 0 Then
Value = Word
Return True
End If
Next
Return False
End Function
که مشکل دیگه ای که وجود داشت در استفاده از LINQ ورودی Value رو چون ByRef بود قبول نمی کرد. و بنظر همون دستور اول بهتر بود:
Untitled.jpg