Конечно! C # - это язык намного более высокого уровня, чем C, и он обрабатывает множество деталей для вас.
Хотя есть одна рекомендация, C # - очень хороший язык, но он имеет немного более крутой курс обучения, чем VB.NET. VB.NET НЕ Visual Basic, он просто переносит часть синтаксиса.
Синтаксис и ключевые слова VB.NET легче выучить, а затем легко переводить на C #. Помимо особых случаев, очень мало вещей, которые один язык может сделать, а другой - нет, и, поскольку VB.NET легче изучать, я большой сторонник его использования в качестве языка "welcome to .NET".
Просто для пояснения: не следует распространять клеймо «Классического» VB на VB.NET, VB6 и VB.NET - это совершенно разные языки и структуры, имеющие только поверхностное сходство.
VB.NET предлагает несколько новинок для новых разработчиков:
Чтобы быть справедливым, у меня есть один главный недостаток , который я имею с шаблонами кода VB.NET по умолчанию - они не имеют «Option Strict On» и «Option Explicit На "заявлениях наверху. Если вы попадете в VB.NET, обязательно добавьте их в каждый класс, они позволят компилятору выполнять более упреждающую проверку ошибок и приведут к более высокому качеству кода и понимания системы типов .NET
Предложить пример эквивалентного кода .NET, написанного на C # и VB.NET:
C #
interface INamedObject
{
string Name { get; set; }
}
abstract class MyBaseClass
{
void PrintType()
{
Console.WriteLine(this.GetType().Name);
}
}
class MyConcreteClass : MyBaseClass, INamedObject
{
public MyConcreteClass()
: base()
{
}
public string Name
{
get;
set;
}
}
VB.NET
Option Strict On
Option Explicit On
Interface INamedObject
Property Name() As String
End Interface
MustInherit Class MyBaseClass
Sub PrintType()
Console.WriteLine(Me.GetType.Name)
End Sub
End Class
Class MyConcreteClass
Inherits MyBaseClass
Implements INamedObject
Public Sub New()
MyBase.New()
End Sub
Private _Name As String
Public Property Name() As String Implements INamedObject.Name
Get
Return _Name
End Get
Set(ByVal value As String)
_Name = value
End Set
End Property
End Class
Если вы используете Silverlight 3.0, то использование CollectionViewSource - самый чистый способ. См. Пример ниже: (это также можно сделать через xaml)
ObservableCollection<DateTime> ecAll = new ObservableCollection<DateTime>();
CollectionViewSource sortedcvs = new CollectionViewSource();
sortedcvs.SortDescriptions.Add(new System.ComponentModel.SortDescription("Date",
System.ComponentModel.ListSortDirection.Ascending));
sortedcvs.Source = ecAll;
ListBoxContainer.DataContext = sortedcvs;
И в соответствующем наборе xaml
ItemsSource="{Binding}"
для ListBox или любого производного элемента управления ItemsControl
Since the collection doesn't provide any Sort
mechanism, this is probably the most practical option. You could implement a sort manually using Move
etc, but it will probably be slower than doing in this way.
var arr = list.OrderBy(x => x.SomeProp).ToArray();
list.Clear();
foreach (var item in arr) {
list.Add(item);
}
Additionally, you might consider unbinding any UI elements while sorting (via either approach) you only pay to re-bind once:
Interestingly, if this was BindingList
, you could use RaiseListChangedEvents
to minimise the number of notifications:
var arr = list.OrderBy(x => x).ToArray();
bool oldRaise = list.RaiseListChangedEvents;
list.RaiseListChangedEvents = false;
try {
list.Clear();
foreach (var item in arr) {
list.Add(item);
}
} finally {
list.RaiseListChangedEvents = oldRaise;
if (oldRaise) list.ResetBindings();
}
Note that in Linq, you are given an IEnumerable from your query, and that query has not executed yet. Therefore, the following code only runs the query once, to add it to an ObservableCollection:
var query = from x in Data
where x.Tag == "Something"
select x;
foreach(var item in query)
MyObservableCollection.Add(item);
Take a look at the "OrderBy" extension on IEnumerable:
foreach(var item in query.OrderBy(x => x.Name))
MyObservableCollection.Add(item);
ObservableCollections не предназначены для сортировки. Список можно сортировать, и это основной механизм, используемый ответом, ссылающимся на List.Sort (), но ObservableCollection не является производным от List, поэтому вам здесь не повезло. Imo, «правильное» решение - не пытаться отсортировать ObservableCollection, а реализовать ICollectionView и привязать экземпляр этого к вашему элементу управления. Этот интерфейс добавляет методы сортировки и имеет дополнительное преимущество, заключающееся в том, что он распознается элементами управления Silverlight (ну, теми, которые все равно поддерживают его, например DataGrid), поэтому сортировку можно использовать непосредственно из уровня пользовательского интерфейса. Этот вопрос может быть полезным:
Я перешел по ссылке, упомянутой в этом посте http://mokosh.co.uk/post/2009/08/04/how-to-sort-observablecollection/comment-page-1/#comment-75
,но у меня возникли проблемы с его работой в Silverlight
Я создал свойство, общедоступное SortableObservableCollection Terms Когда я вызываю Terms.Sort(new TermComparer()), записи по-прежнему отображаются неотсортированные в пользовательском интерфейсе
, что может указывать на то, что может пойти не так. спасибо