Я попробовал вышеуказанное решение, но я счел его непригодным для больших объемов данных. Затем я обнаружил функцию потока:
MongoClient.connect("...", function(err, db){
var c = db.collection('yourCollection');
var s = c.find({/* your query */}).stream();
s.on('data', function(doc){
c.update({_id: doc._id}, {$set: {name : doc.firstName + ' ' + doc.lastName}}, function(err, result) { /* result == true? */} }
});
s.on('end', function(){
// stream can end before all your updates do if you have a lot
})
})
Exception When
пункт в основном неизвестен.
Рассмотрите это:
Public Sub Login(host as string, user as String, password as string, _
Optional bRetry as Boolean = False)
Try
ssh.Connect(host, user, password)
Catch ex as TimeoutException When Not bRetry
''//Try again, but only once.
Login(host, user, password, True)
Catch ex as TimeoutException
''//Log exception
End Try
End Sub
Вы заметили Подобный оператор сравнения?
Dim b As Boolean = "file.txt" Like "*.txt"
Больше из MSDN
Dim testCheck As Boolean
' The following statement returns True (does "F" satisfy "F"?)'
testCheck = "F" Like "F"
' The following statement returns False for Option Compare Binary'
' and True for Option Compare Text (does "F" satisfy "f"?)'
testCheck = "F" Like "f"
' The following statement returns False (does "F" satisfy "FFF"?)'
testCheck = "F" Like "FFF"
' The following statement returns True (does "aBBBa" have an "a" at the'
' beginning, an "a" at the end, and any number of characters in '
' between?)'
testCheck = "aBBBa" Like "a*a"
' The following statement returns True (does "F" occur in the set of'
' characters from "A" through "Z"?)'
testCheck = "F" Like "[A-Z]"
' The following statement returns False (does "F" NOT occur in the '
' set of characters from "A" through "Z"?)'
testCheck = "F" Like "[!A-Z]"
' The following statement returns True (does "a2a" begin and end with'
' an "a" and have any single-digit number in between?)'
testCheck = "a2a" Like "a#a"
' The following statement returns True (does "aM5b" begin with an "a",'
' followed by any character from the set "L" through "P", followed'
' by any single-digit number, and end with any character NOT in'
' the character set "c" through "e"?)'
testCheck = "aM5b" Like "a[L-P]#[!c-e]"
' The following statement returns True (does "BAT123khg" begin with a'
' "B", followed by any single character, followed by a "T", and end'
' with zero or more characters of any type?)'
testCheck = "BAT123khg" Like "B?T*"
' The following statement returns False (does "CAT123khg" begin with'
' a "B", followed by any single character, followed by a "T", and'
' end with zero or more characters of any type?)'
testCheck = "CAT123khg" Like "B?T*"
Enum
sОдна из реальных скрытых функций VB completionlist
Тег документации XML, который может использоваться для создания собственный Enum
- как типы с расширенной функциональностью. Эта функция не работает в C#, все же.
Один пример из недавнего моего кода:
'
''' <completionlist cref="RuleTemplates"/>
Public Class Rule
Private ReadOnly m_Expression As String
Private ReadOnly m_Options As RegexOptions
Public Sub New(ByVal expression As String)
Me.New(expression, RegexOptions.None)
End Sub
Public Sub New(ByVal expression As String, ByVal options As RegexOptions)
m_Expression = expression
m_options = options
End Sub
Public ReadOnly Property Expression() As String
Get
Return m_Expression
End Get
End Property
Public ReadOnly Property Options() As RegexOptions
Get
Return m_Options
End Get
End Property
End Class
Public NotInheritable Class RuleTemplates
Public Shared ReadOnly Whitespace As New Rule("\s+")
Public Shared ReadOnly Identifier As New Rule("\w+")
Public Shared ReadOnly [String] As New Rule("""([^""]|"""")*""")
End Class
Теперь, при присвоении значения переменной, объявленной как Rule
, IDE предлагает список IntelliSense возможных значений от RuleTemplates
.
Так как это - функция, которая полагается на IDE, трудно показать, как это смотрит, когда Вы используете его, но я буду просто использовать снимок экрана:
Список завершения в действии http://page.mi.fu-berlin.de/krudolph/stuff/completionlist.png
На самом деле IntelliSense на 100% идентичен тому, что Вы получаете при использовании Enum
.
О! и не забывайте литералы XML.
Dim contact2 = _
<contact>
<name>Patrick Hines</name>
<%= From p In phoneNumbers2 _
Select <phone type=<%= p.Type %>><%= p.Number %></phone> _
%>
</contact>
VB знает примитив отчасти typedef
через Import
псевдонимы:
Imports S = System.String
Dim x As S = "Hello"
Это более полезно при использовании в сочетании с универсальными типами:
Imports StringPair = System.Collections.Generic.KeyValuePair(Of String, String)
Объектная инициализация там также!
Dim x as New MyClass With {.Prop1 = foo, .Prop2 = bar}
DirectCast
DirectCast
чудо. На поверхности это работает подобное CType
оператор в этом это преобразовывает объект из одного типа в другого. Однако это работает намного более строгим подшипником. CType
фактическое поведение поэтому часто непрозрачно, и это нисколько не очевидно, какой вид преобразования выполняется.
DirectCast
только поддержки две отличных операции:
Любой другой бросок не будет работать (например, пытающийся распаковать Integer
к a Double
) и закончится во время компиляции / ошибка периода выполнения (в зависимости от ситуации и что может быть обнаружено статической проверкой типа). Я поэтому использую DirectCast
когда это возможно, поскольку это получает мое намерение лучше всего: в зависимости от ситуации я или хотите распаковать значение известного типа или выполнить восходящее. Конец истории.
Используя CType
, с другой стороны, оставляет читателя кода, задающегося вопросом, что действительно предназначил программист, потому что он решает ко всем видам различных операций, включая вызов пользовательского кода.
Почему это - скрытая функция? Команда VB опубликовала guideline1, который препятствует использованию DirectCast
(даже при том, что это на самом деле быстрее!) для создания кода большим количеством универсальной формы. Я утверждаю, что это - плохая инструкция, которая должна быть инвертирована: Каждый раз, когда возможно, польза DirectCast
по более общему CType
оператор. Это делает код намного более четким. CType
, с другой стороны, должен только быть назван, если это действительно предназначается, т.е. когда сужение CType
оператор (cf. перегрузка оператора) нужно назвать.
1) Я не могу придумать ссылку на инструкцию, но я нашел, что Paul Vick берет ее (главный разработчик команды VB):
В реальном мире Вы почти никогда не собираетесь замечать различие, таким образом, Вы могли бы также пойти с более гибкими операторами преобразования как CType, CInt, и т.д.
(РЕДАКТИРОВАНИЕ Zack: Узнайте больше здесь: Как я должен бросить в VB.NET?)
If
условное выражение и объединяет операторЯ не знаю, как скрытый Вы назвали бы его, но Iif ([выражение], [оценивают, если верный], [оценивают, если ложь]), Поскольку Объектная функция могла бы рассчитать.
Это не так скрыто, как удерживается от использования! VB 9 имеет If
оператор, который намного лучше и работает точно условным выражением C# и объединяет оператор (в зависимости от того, что Вы хотите):
Dim x = If(a = b, c, d)
Dim hello As String = Nothing
Dim y = If(hello, "World")
Отредактированный для показа другого примера:
Это будет работать с If()
, но вызовите исключение с IIf()
Dim x = If(b<>0,a/b,0)
Это - хорошее. Избранный Оператор выбора в VB.Net очень мощен.
Уверенный существует стандарт
Select Case Role
Case "Admin"
''//Do X
Case "Tester"
''//Do Y
Case "Developer"
''//Do Z
Case Else
''//Exception case
End Select
Но существует больше...
Можно сделать диапазоны:
Select Case Amount
Case Is < 0
''//What!!
Case 0 To 15
Shipping = 2.0
Case 16 To 59
Shipping = 5.87
Case Is > 59
Shipping = 12.50
Case Else
Shipping = 9.99
End Select
И еще больше...
Вы можете (хотя может не быть хорошая идея), делают булевская переменная проверяет несколько переменных:
Select Case True
Case a = b
''//Do X
Case a = c
''//Do Y
Case b = c
''//Do Z
Case Else
''//Exception case
End Select
Одно главное средство экономии времени, которое я использую все время, С ключевым словом:
With ReallyLongClassName
.Property1 = Value1
.Property2 = Value2
...
End With
Мне просто не нравится вводить больше, чем я имею к!
(РЕДАКТИРОВАНИЕ: Узнайте больше здесь: я должен всегда использовать операторы AndAlso и OrElse?)
Статические участники в методах.
Например:
Function CleanString(byval input As String) As String
Static pattern As New RegEx("...")
return pattern.Replace(input, "")
End Function
В вышеупомянутой функции регулярное выражение шаблона будет только когда-либо создаваться однажды, неважно, сколько раз вызвана функция.
Другое использование должно сохранить экземпляр "случайных" вокруг:
Function GetNextRandom() As Integer
Static r As New Random(getSeed())
Return r.Next()
End Function
Кроме того, это не то же как простое объявление его как Общий член класса; объекты объявили, что этот путь, как гарантируют, будет ориентирован на многопотоковое исполнение также. Это не имеет значения в этом сценарии, так как выражение никогда не будет изменяться, но существуют другие, где это могло бы.
Хотя редко полезный, обработка событий может быть в большой степени настроена:
Public Class ApplePie
Private ReadOnly m_BakedEvent As New List(Of EventHandler)()
Custom Event Baked As EventHandler
AddHandler(ByVal value As EventHandler)
Console.WriteLine("Adding a new subscriber: {0}", value.Method)
m_BakedEvent.Add(value)
End AddHandler
RemoveHandler(ByVal value As EventHandler)
Console.WriteLine("Removing subscriber: {0}", value.Method)
m_BakedEvent.Remove(value)
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
Console.WriteLine("{0} is raising an event.", sender)
For Each ev In m_BakedEvent
ev.Invoke(sender, e)
Next
End RaiseEvent
End Event
Public Sub Bake()
''// 1. Add ingredients
''// 2. Stir
''// 3. Put into oven (heated, not pre-heated!)
''// 4. Bake
RaiseEvent Baked(Me, EventArgs.Empty)
''// 5. Digest
End Sub
End Class
Это может затем быть протестировано следующим способом:
Module Module1
Public Sub Foo(ByVal sender As Object, ByVal e As EventArgs)
Console.WriteLine("Hmm, freshly baked apple pie.")
End Sub
Sub Main()
Dim pie As New ApplePie()
AddHandler pie.Baked, AddressOf Foo
pie.Bake()
RemoveHandler pie.Baked, AddressOf Foo
End Sub
End Module
Мне действительно нравится "Мое" Пространство имен, которое было представлено в Visual Basic 2005. Мой - ярлык на несколько групп информации и функциональности. Это обеспечивает быстрый и интуитивный доступ к следующим типам информации:
Это встроено, и определенное преимущество перед C#. Способность реализовать метод интерфейса, не имея необходимость использовать то же имя.
Такой как:
Public Sub GetISCSIAdmInfo(ByRef xDoc As System.Xml.XmlDocument) Implements IUnix.GetISCSIInfo
End Sub
Передающие параметры по имени и, таким образом переупорядочивая их
Sub MyFunc(Optional msg as String= "", Optional displayOrder As integer = 0)
'Do stuff
End function
Использование:
Module Module1
Sub Main()
MyFunc() 'No params specified
End Sub
End Module
Может также быть назван с помощью ": =" спецификация параметра в любом порядке:
MyFunc(displayOrder:=10, msg:="mystring")
Оператор Using является новым с VB 8, C# имел его от запуска. Это звонит, располагают автоволшебно для Вас.
Например.
Using lockThis as New MyLocker(objToLock)
End Using
Псевдонимы импорта также в основном неизвестны:
Import winf = System.Windows.Forms
''Later
Dim x as winf.Form
При необходимости в имени переменной для соответствия имени переменной ключевого слова, включите его со скобками. Не NEC. лучшая практика, хотя - но это может использоваться мудро.
например.
Class CodeException
Public [Error] as String
''...
End Class
''later
Dim e as new CodeException
e.Error = "Invalid Syntax"
например, Пример из комментариев (@Pondidum):
Class Timer
Public Sub Start()
''...
End Sub
Public Sub [Stop]()
''...
End Sub
Рассмотрите следующее объявление события
Public Event SomethingHappened As EventHandler
В C# можно проверить на подписчиков события при помощи следующего синтаксиса:
if(SomethingHappened != null)
{
...
}
Однако компилятор VB.NET не поддерживает это. Это на самом деле создает скрытое поле члена парламента, не занимающего официального поста, которое не видимо в IntelliSense:
If Not SomethingHappenedEvent Is Nothing OrElse SomethingHappenedEvent.GetInvocationList.Length = 0 Then
...
End If
Больше информации:
http://jelle.druyts.net/2003/05/09/BehindTheScenesOfEventsInVBNET.aspx http://blogs.msdn.com/vbteam/archive/2009/09/25/testing-events-for-nothing-null-doug-rothaus.aspx
Я просто нашел статью, говорящую о"!" оператор, также знайте как "оператор поиска по словарю". Вот выборка от статьи в: http://panopticoncentral.net/articles/902.aspx
Техническое имя для! оператор является "оператором поиска по словарю". Словарь является любым типом набора, который индексируется ключом, а не числом, точно так же, как способ, которым записи в английском словаре индексируются словом, из которого Вы хотите определение. Наиболее распространенным примером типа словаря является Система. Наборы. Хеш-таблица, которая позволяет Вам добавлять (ключ, значение) пар в хеш-таблицу и затем получать значения с помощью ключей. Например, следующий код добавляет три записи в хеш-таблицу и смотрит один из них использование ключевой "Свинины".
Dim Table As Hashtable = New Hashtable
Table("Orange") = "A fruit"
Table("Broccoli") = "A vegetable"
Table("Pork") = "A meat"
Console.WriteLine(Table("Pork"))
! оператор может использоваться для поиска значений от любого типа словаря, который индексирует его значения с помощью строк. Идентификатор после! используется в качестве ключа в операции поиска. Таким образом, вышеупомянутый код, возможно, вместо этого был написан:
Dim Table As Hashtable = New Hashtable
Table!Orange = "A fruit"
Table!Broccoli = "A vegetable"
Table!Pork = "A meat"
Console.WriteLine(Table!Pork)
Второй пример абсолютно эквивалентен первому, но просто выглядит намного более хорошим, по крайней мере, моим глазам. Я нахожу, что существует много мест где! может использоваться, особенно когда дело доходит до XML и сети, где существуют только тонны наборов, которые индексируются строкой. Одно неудачное ограничение то, что вещь после! все еще должен быть допустимый идентификатор, поэтому если строка, которую Вы хотите использовать в качестве ключа, имеет некоторый недопустимый символ идентификатора в нем, Вы не можете использовать! оператор. (Вы не можете, например, сказать "Таблицу! AB$CD = 5 дюймов, потому что $ не законен в идентификаторах.) В VB6 и прежде, Вы могли использовать скобки для выхода из недопустимых идентификаторов (т.е. "Таблица! [AB$CD]"), но когда мы начали использовать скобки для выхода из ключевых слов, мы потеряли способность сделать это. В большинстве случаев, однако, это не слишком много ограничения.
Стать действительно техническим, x! y работает, если x имеет свойство по умолчанию, которое берет Строку или Объект в качестве параметра. В этом случае, x! y изменяется в x. DefaultProperty ("y"). Интересное примечание стороны - то, что существует специальное правило в лексической грамматике языка для создания этой всей работы.! символ также используется в качестве символа текста на языке, и символы текста едят перед операторами. Таким образом без специального правила, x! y был бы просканирован как "x! y" вместо "x! y". К счастью, с тех пор нет никакого места на языке, где два идентификатора подряд допустимы, мы просто представили правило что если следующий символ после! запуск идентификатора, мы рассматриваем! быть оператором и не символом текста.
У Вас может быть 2 строки кода во всего одной строке. следовательно:
Dim x As New Something : x.CallAMethod
Дополнительные параметры
Optionals настолько легче, чем создание новые перегрузки, таковы как:
Function CloseTheSystem(Optional ByVal msg AS String = "Shutting down the system...")
Console.Writeline(msg)
''//do stuff
End Function
Случай заголовка в VB.Net может быть достигнут старым VB6 fxn:
StrConv(stringToTitleCase, VbStrConv.ProperCase,0) ''0 is localeID
Свойства с параметрами
Я делал некоторое программирование C# и обнаружил функцию, которая пропускала это, VB.Net имел, но не был упомянут здесь.
Пример того, как сделать это (а также c# ограничение) виден в: Используя типичное получают установленные свойства в C#... с параметрами
Я извлек код из того ответа:
Private Shared m_Dictionary As IDictionary(Of String, Object) = _
New Dictionary(Of String, Object)
Public Shared Property DictionaryElement(ByVal Key As String) As Object
Get
If m_Dictionary.ContainsKey(Key) Then
Return m_Dictionary(Key)
Else
Return [String].Empty
End If
End Get
Set(ByVal value As Object)
If m_Dictionary.ContainsKey(Key) Then
m_Dictionary(Key) = value
Else
m_Dictionary.Add(Key, value)
End If
End Set
End Property
Лучший и простой парсер CSV:
Microsoft.VisualBasic.FileIO.TextFieldParser
Добавив ссылку на Microsoft.VisualBasic, можно использовать его на любом другом языке .Net, например C #
DateTime можно инициализировать, заключив дату в #
Dim independanceDay As DateTime = #7/4/1776#
. Вы также можете использовать вывод типа вместе с этим синтаксисом
Dim independanceDay = #7/4/1776#
Это намного лучше, чем использование конструктора
Dim independanceDay as DateTime = New DateTime(1776, 7, 4)
В vb эти операторы различаются:
/
равно Двойное значение
\
равно Целое число
без остатка
Sub Main()
Dim x = 9 / 5
Dim y = 9 \ 5
Console.WriteLine("item x of '{0}' equals to {1}", x.GetType.FullName, x)
Console.WriteLine("item y of '{0}' equals to {1}", y.GetType.FullName, y)
'Results:
'item x of 'System.Double' equals to 1.8
'item y of 'System.Int32' equals to 1
End Sub
Есть несколько ответов о XML-литералах, но не об этом конкретном случае:
Вы можете использовать XML-литералы для включения строковых литералов, которые в противном случае потребовалось бы экранировать. Например, строковые литералы, содержащие двойные кавычки.
Вместо этого:
Dim myString = _
"This string contains ""quotes"" and they're ugly."
Вы можете сделать это:
Dim myString = _
<string>This string contains "quotes" and they're nice.</string>.Value
Это особенно полезно, если вы тестируете литерал для синтаксического анализа CSV:
Dim csvTestYuck = _
"""Smith"", ""Bob"", ""123 Anywhere St"", ""Los Angeles"", ""CA"""
Dim csvTestMuchBetter = _
<string>"Smith", "Bob", "123 Anywhere St", "Los Angeles", "CA"</string>.Value
(Вы не Конечно, не нужно использовать тег
; вы можете использовать любой тег, который вам нравится.)
Форсирование ByVal
В VB, если вы заключите свои аргументы в дополнительный набор круглых скобок, вы можете переопределить объявление метода ByRef и превратить его в ByVal. Например, следующий код производит 4, 5, 5 вместо 4,5,6
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim R = 4
Trace.WriteLine(R)
Test(R)
Trace.WriteLine(R)
Test((R))
Trace.WriteLine(R)
End Sub
Private Sub Test(ByRef i As Integer)
i += 1
End Sub
См. Аргумент, не изменяемый вызовом процедуры - базовая переменная