Я попробовал вышеуказанное решение, но я счел его непригодным для больших объемов данных. Затем я обнаружил функцию потока:
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
})
})
В VB8 и бывших версиях, если Вы не указывали типа для переменной, Вы представляете, Тип объекта был автоматически обнаружен. В VB9 (2008), Dim
действовал бы как C# var
ключевое слово, если Опция Выводит, установлено на На (который является, по умолчанию),
может быть эта ссылка, должен помочь
http://blogs.msdn.com/vbteam/archive/2007/11/20/hidden-gems-in-visual-basic-2008-amanda-silver.aspx
Также важно помнить, что проекты VB.NET, по умолчанию, имеют корневое пространство имен, которое является частью свойств проекта. По умолчанию это корневое пространство имен будет иметь то же имя как проект. При использовании блочной структуры Пространства имен Имена на самом деле добавляются к тому корневому пространству имен. Например: если проект называют MyProject, то мы могли объявить переменную как:
Private obj As MyProject.MyNamespace.MyClass
Для изменения корневого пространства имен используйте пункт меню Project-> Properties. Корневое пространство имен может быть очищено также, означая, что все блоки Пространства имен становятся корневым уровнем для кода, который они содержат.
Ключевое слово MyClass позволяет относиться к участникам экземпляра класса, как первоначально реализовано, игнорируя любые переопределения производного класса.
VB также предлагает оператор OnError. Но это не большая часть использования эти дни.
On Error Resume Next
' Or'
On Error GoTo someline
Пространства имен Aliassing
Imports Lan = Langauge
Хотя не уникальный для VB.Net об этом часто забывают при столкновении с конфликтами пространства имен.
Можно использовать R.E.M, чтобы прокомментировать строку вместо '. Не супер полезный, но помогает важному безусловному победителю комментариев w/o использование"!!!!!!!" или что бы то ни было.
Не возможно Явно реализовать интерфейсных участников в VB, но возможно реализовать их с другим именем.
Interface I1
Sub Foo()
Sub TheFoo()
End Interface
Interface I2
Sub Foo()
Sub TheFoo()
End Interface
Class C
Implements I1, I2
Public Sub IAmFoo1() Implements I1.Foo
' Something happens here'
End Sub
Public Sub IAmFoo2() Implements I2.Foo
' Another thing happens here'
End Sub
Public Sub TheF() Implements I1.TheFoo, I2.TheFoo
' You shouldn't yell!'
End Sub
End Class
Я не знаю, как скрытый Вы назвали бы его, но If
оператор мог рассчитать.
Это очень похоже, в некотором смысле, на ?:
(троичный) или ??
оператор в большом количестве подобных языкам C. Однако важно отметить, что это действительно оценивает все параметры, таким образом, важно не передать в чем-либо, что может вызвать исключение (если Вы не хотите это к), или что-либо, что может вызвать непреднамеренные побочные эффекты.
Использование:
Dim result = If(condition, valueWhenTrue, valueWhenFalse)
Dim value = If(obj, valueWhenObjNull)
Когда-нибудь Рядовые пользователи не представляли переменной. Они представили их только при помощи их. Явная Опция VB была представлена только, чтобы удостовериться, что Вы не представите переменной по ошибке плохим вводом. Можно всегда поворачивать его к Прочь, испытывать дни, мы работали с Основным.
Я раньше очень любил дополнительные параметры функции, но я использую их меньше теперь, когда я должен пойти назад и вперед между C# и VB много. Когда C# будет поддерживать их? C++ и даже C имел их (в некотором роде)!
Вы можете иметь Если в одной строке.
If True Then DoSomething()
Select Case in place of multiple If/ElseIf/Else statements.
Assume simple geometry objects in this example:
Function GetToString(obj as SimpleGeomertyClass) as String
Select Case True
Case TypeOf obj is PointClass
Return String.Format("Point: Position = {0}", _
DirectCast(obj,Point).ToString)
Case TypeOf obj is LineClass
Dim Line = DirectCast(obj,LineClass)
Return String.Format("Line: StartPosition = {0}, EndPosition = {1}", _
Line.StartPoint.ToString,Line.EndPoint.ToString)
Case TypeOf obj is CircleClass
Dim Line = DirectCast(obj,CircleClass)
Return String.Format("Circle: CenterPosition = {0}, Radius = {1}", _
Circle.CenterPoint.ToString,Circle.Radius)
Case Else
Return String.Format("Unhandled Type {0}",TypeName(obj))
End Select
End Function
Стек / группировка нескольких операторов using вместе:
Dim sql As String = "StoredProcedureName"
Using cn As SqlConnection = getOpenConnection(), _
cmd As New SqlCommand(sql, cn), _
rdr As SqlDataReader = cmd.ExecuteReader()
While rdr.Read()
''// Do Something
End While
End Using
Честно говоря, вы также можете сделать это на C #. Но многие люди не знают об этом ни на одном из языков.
Подобно ответу Парса , оператор like имеет много вещей, которые он может сопоставить помимо простых подстановочных знаков. Я чуть не упал со стула, когда читал об этом документ MSDN :-)
IIf(False, MsgBox("msg1"), MsgBox("msg2"))
Что в результате? два окна сообщений !!!! Это происходит потому, что функция IIf оценивает оба параметра при достижении функции.
VB имеет новый оператор If (точно так же, как C #?: Operator):
If(False, MsgBox("msg1"), MsgBox("msg2"))
Будет отображать только второй msgbox.
в общем, я бы рекомендовал заменить все IIF в вашем vb-коде, если вы не хотите, чтобы он оценивал оба элемента:
Dim value = IIf(somthing, LoadAndGetValue1(), LoadAndGetValue2())
вы можете быть уверены, что оба значения были загружены.
Если вы никогда не знали о следующем, вы действительно не поверите, что это правда, это действительно то, чего C # не хватает на самом деле:
(Это называется литералами XML)
Imports <xmlns:xs="System">
Module Module1
Sub Main()
Dim xml =
<root>
<customer id="345">
<name>John</name>
<age>17</age>
</customer>
<customer id="365">
<name>Doe</name>
<age>99</age>
</customer>
</root>
Dim id = 1
Dim name = "Beth"
DoIt(
<param>
<customer>
<id><%= id %></id>
<name><%= name %></name>
</customer>
</param>
)
Dim names = xml...<name>
For Each n In names
Console.WriteLine(n.Value)
Next
For Each customer In xml.<customer>
Console.WriteLine("{0}: {1}", customer.@id, customer.<age>.Value)
Next
Console.Read()
End Sub
Private Sub CreateClass()
Dim CustomerSchema =
XDocument.Load(CurDir() & "\customer.xsd")
Dim fields =
From field In CustomerSchema...<xs:element>
Where field.@type IsNot Nothing
Select
Name = field.@name,
Type = field.@type
Dim customer =
<customer> Public Class Customer
<%= From field In fields Select <f>
Private m_<%= field.Name %> As <%= GetVBPropType(field.Type) %></f>.Value %>
<%= From field In fields Select <p>
Public Property <%= field.Name %> As <%= GetVBPropType(field.Type) %>
Get
Return m_<%= field.Name %>
End Get
Set(ByVal value As <%= GetVBPropType(field.Type) %>)
m_<%= field.Name %> = value
End Set
End Property</p>.Value %>
End Class</customer>
My.Computer.FileSystem.WriteAllText("Customer.vb",
customer.Value,
False,
System.Text.Encoding.ASCII)
End Sub
Private Function GetVBPropType(ByVal xmlType As String) As String
Select Case xmlType
Case "xs:string"
Return "String"
Case "xs:int"
Return "Integer"
Case "xs:decimal"
Return "Decimal"
Case "xs:boolean"
Return "Boolean"
Case "xs:dateTime", "xs:date"
Return "Date"
Case Else
Return "'TODO: Define Type"
End Select
End Function
Private Sub DoIt(ByVal param As XElement)
Dim customers =
From customer In param...<customer>
Select New Customer With
{
.ID = customer.<id>.Value,
.FirstName = customer.<name>.Value
}
For Each c In customers
Console.WriteLine(c.ToString())
Next
End Sub
Private Class Customer
Public ID As Integer
Public FirstName As String
Public Overrides Function ToString() As String
Return <string>
ID : <%= Me.ID %>
Name : <%= Me.FirstName %>
</string>.Value
End Function
End Class
End Module
'Results:
ID : 1
Name : Beth
John
Doe
345: 17
365: 99
Возьмите посмотрите Советы / хитрости XML-литералов Бет Масси.
Вы можете использовать зарезервированное ключевое слово для свойств и имен переменных, если вы заключите имя в [и]
Public Class Item
Private Value As Integer
Public Sub New(ByVal value As Integer)
Me.Value = value
End Sub
Public ReadOnly Property [String]() As String
Get
Return Value
End Get
End Property
Public ReadOnly Property [Integer]() As Integer
Get
Return Value
End Get
End Property
Public ReadOnly Property [Boolean]() As Boolean
Get
Return Value
End Get
End Property
End Class
'Real examples:
Public Class PropertyException : Inherits Exception
Public Sub New(ByVal [property] As String)
Me.Property = [property]
End Sub
Private m_Property As String
Public Property [Property]() As String
Get
Return m_Property
End Get
Set(ByVal value As String)
m_Property = value
End Set
End Property
End Class
Public Enum LoginLevel
[Public] = 0
Account = 1
Admin = 2
[Default] = Account
End Enum
В отличие от C #, в VB вы можете полагаться на значения по умолчанию для элементов, не допускающих значения NULL:
Sub Main()
'Auto assigned to def value'
Dim i As Integer '0'
Dim dt As DateTime '#12:00:00 AM#'
Dim a As Date '#12:00:00 AM#'
Dim b As Boolean 'False'
Dim s = i.ToString 'valid
End Sub
Тогда как в C # это будет ошибка компилятора:
int x;
var y = x.ToString(); //Use of unassigned value
Private Sub Button1_Click(ByVal sender As Button, ByVal e As System.EventArgs)
Handles Button1.Click
sender.Enabled = True
DisableButton(sender)
End Sub
Private Sub Disable(button As Object)
button.Enabled = false
End Sub
В этом фрагменте у вас есть 2 (а может, и больше?) Вещи, которые вы никогда не смогли бы сделать в C #:
Кроме того, в C # вы не можете использовать ожидаемую функциональность для объекта - в C # вы можете мечтать об этом (теперь они сделали ключевое слово dynamic, но оно далеко от В.Б.). В C #, если вы напишете (новый объект ()). Enabled, вы получите сообщение об ошибке, что объект типа не имеет метода «Enabled». Я не из тех, кто будет рекомендовать вам, безопасно это или нет, информация предоставляется КАК ЕСТЬ, делать самостоятельно, по-прежнему, иногда (например, при работе с COM-объектами) это очень хорошо. Я лично всегда пишу (отправитель как кнопка), когда ожидаемое значение обязательно является кнопкой.
Более того: возьмите этот пример:
Private Sub control_Click(ByVal sender As Control, ByVal e As System.EventArgs)
Handles TextBox1.Click, CheckBox1.Click, Button1.Click
sender.Text = "Got it?..."
End Sub
Это происходит потому, что вызов ShowDialog
также изменяет состояние своего владельца.
Чтобы этого не происходило, необходимо сбросить DialogResult
из первого модального диалогового окна в DialogResult.None
после вызова ShowDialog
второго диалогового окна:
private void Button1_Click(object sender, EventArgs e)
{
InnerDialog inner = new InnerDialog()
DialogResult innerResult = inner.ShowDialog(this);
this.DialogResult = DialogResult.None;
}
Это давняя проблема (см. this сообщение).
Module Module1
Sub Main()
Dim str1 = "initial"
Dim str2 = "initial"
DoByVal(str1)
DoByRef(str2)
Console.WriteLine(str1)
Console.WriteLine(str2)
End Sub
Sub DoByVal(ByVal str As String)
str = "value 1"
End Sub
Sub DoByRef(ByRef str As String)
str = "value 2"
End Sub
End Module
'Results:
'initial
'value 2
Одна из функций, которые я нашел действительно полезными и помогла решить множество ошибок, - это явная передача аргументов функциям, особенно при использовании optional.
Вот пример:
Public Function DoSomething(byval x as integer, optional y as boolean=True, optional z as boolean=False)
' ......
End Function
тогда вы можете назовите его так:
DoSomething(x:=1, y:=false)
DoSomething(x:=2, z:=true)
or
DoSomething(x:=3,y:=false,z:=true)
Это намного чище и без ошибок, тогда вызовите такую функцию
DoSomething(1,true)
Ключевое слово Nothing может означать значение по умолчанию (T) или null, в зависимости от контекста. Вы можете использовать это, чтобы создать очень интересный метод:
'''<summary>Returns true for reference types, false for struct types.</summary>'
Public Function IsReferenceType(Of T)() As Boolean
Return DirectCast(Nothing, T) Is Nothing
End Function
Обратите внимание на использование , когда
в строке Catch ex As IO.FileLoadException When try <3
Do
Dim attempt As Integer
Try
''// something that might cause an error.
Catch ex As IO.FileLoadException When attempt < 3
If MsgBox("do again?", MsgBoxStyle.YesNo) = MsgBoxResult.No Then
Exit Do
End If
Catch ex As Exception
''// if any other error type occurs or the attempts are too many
MsgBox(ex.Message)
Exit Do
End Try
''// increment the attempt counter.
attempt += 1
Loop
Недавно просмотренные в VbRad
При объявлении массива в vb.net всегда используйте синтаксис «от 0 до xx».
Dim b(0 to 9) as byte 'Declares an array of 10 bytes
Он дает очень четкое представление о диапазоне массива. Сравните его с эквивалентом
Dim b(9) as byte 'Declares another array of 10 bytes
. Даже если вы знаете, что второй пример состоит из 10 элементов, он не кажется очевидным. И я не могу вспомнить, сколько раз я видел код от программиста, который хотел вышеизложенное, но вместо этого написал
Dim b(10) as byte 'Declares another array of 10 bytes
Это, конечно, совершенно неверно. Поскольку b (10) создает массив из 11 байтов. И это может легко вызвать ошибки, поскольку это выглядит правильным для любого, кто не знает, что искать.
Синтаксис «от 0 до xx» также работает со следующим
Dim b As Byte() = New Byte(0 To 9) {} 'Another way to create a 10 byte array
ReDim b(0 to 9) 'Assigns a new 10 byte array to b
. Используя полный синтаксис, вы также продемонстрируете любой, кто будет читать ваш код в будущем, будет знать, что вы делаете.
Вот забавный эпизод, которого я не видел; Я знаю, что это работает в VS 2008, по крайней мере:
Если вы случайно завершите строку VB точкой с запятой , потому что вы слишком много работали с C #, точка с запятой автоматически удаляется . На самом деле невозможно (опять же, по крайней мере, в VS 2008) случайно закончить строку VB точкой с запятой. Попробуйте!
(Это не идеально; если вы введете точку с запятой в середине окончательного имени класса, оно не будет автоматически заполнять имя класса.)
Sub Main()
Select Case "value to check"
'Check for multiple items at once:'
Case "a", "b", "asdf"
Console.WriteLine("Nope...")
Case "value to check"
Console.WriteLine("Oh yeah! thass what im talkin about!")
Case Else
Console.WriteLine("Nah :'(")
End Select
Dim jonny = False
Dim charlie = True
Dim values = New String() {"asdff", "asdfasdf"}
Select Case "asdfasdf"
'You can perform boolean checks that has nothing to do with your var.,
'not that I would recommend that, but it exists.'
Case values.Contains("ddddddddddddddddddddddd")
Case True
Case "No sense"
Case Else
End Select
Dim x = 56
Select Case x
Case Is > 56
Case Is <= 5
Case Is <> 45
Case Else
End Select
End Sub
Ключевое слово Me
Ключевое слово "Me" является уникальным в VB.Net. Я знаю, что оно довольно распространено, но есть разница между "Me" и эквивалентом "this" в C#. Разница в том, что "this" доступен только для чтения, а "Me" - нет. Это ценно в конструкторах, где у вас есть экземпляр переменной, которой вы хотите, чтобы конструируемая переменная уже была равна, поскольку вы можете просто установить "Me = TheVariable", в отличие от C#, где вам придется копировать каждое поле переменной вручную (что может быть ужасно, если полей много, и чревато ошибками). Обходным решением в C# было бы выполнение присваивания вне конструктора. Это означает, что теперь, если объект самоконструируется в полный объект, вам понадобится еще одна функция.