Сортировка заметного набора с linq

Конечно! 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 предлагает несколько новинок для новых разработчиков:

  • позволяют использовать синтаксис. C # может заставить зеленого разработчика вырвать свои волосы, потому что они забыли () в пустоте или добавили их в свойство.
  • Visual Studio предлагает быструю обратную связь по некомпилируемому коду.
  • VB.NET использует слова в местах, где C # использует символы. В приведенных ниже примерах не то, что C # ожидает, что вы знаете, что «:» означает «Наследует» или «Реализует» в зависимости от следующего аргумента, VB.NET говорит «Наследует MyBaseClass» и «Реализует INamedObject», что гораздо более интуитивно понятно

Чтобы быть справедливым, у меня есть один главный недостаток , который я имею с шаблонами кода 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
20
задан dove 15 June 2009 в 13:35
поделиться

6 ответов

Если вы используете 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

15
ответ дан 30 November 2019 в 00:35
поделиться

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();
    }
9
ответ дан 30 November 2019 в 00:35
поделиться

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);
3
ответ дан 30 November 2019 в 00:35
поделиться

ObservableCollections не предназначены для сортировки. Список можно сортировать, и это основной механизм, используемый ответом, ссылающимся на List.Sort (), но ObservableCollection не является производным от List, поэтому вам здесь не повезло. Imo, «правильное» решение - не пытаться отсортировать ObservableCollection, а реализовать ICollectionView и привязать экземпляр этого к вашему элементу управления. Этот интерфейс добавляет методы сортировки и имеет дополнительное преимущество, заключающееся в том, что он распознается элементами управления Silverlight (ну, теми, которые все равно поддерживают его, например DataGrid), поэтому сортировку можно использовать непосредственно из уровня пользовательского интерфейса. Этот вопрос может быть полезным:

Silverlight и icollectionview

3
ответ дан 30 November 2019 в 00:35
поделиться

Я перешел по ссылке, упомянутой в этом посте http://mokosh.co.uk/post/2009/08/04/how-to-sort-observablecollection/comment-page-1/#comment-75

,но у меня возникли проблемы с его работой в Silverlight

Я создал свойство, общедоступное SortableObservableCollection Terms Когда я вызываю Terms.Sort(new TermComparer()), записи по-прежнему отображаются неотсортированные в пользовательском интерфейсе

, что может указывать на то, что может пойти не так. спасибо

0
ответ дан 30 November 2019 в 00:35
поделиться

Я нашел это на CodePlex:

Сортированные коллекции

Но еще не использовал.

Рик

0
ответ дан 30 November 2019 в 00:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: