Как отсортировать TrackableCollection? - PullRequest
1 голос
/ 04 февраля 2011

У меня есть Entity Framework 'TrackableCollection', и я хочу отсортировать его по атрибуту. Я пытался рассматривать его как IEnumerable и вызывать

TrackableCollection<Something>.OrderBy(q=>q.SomeValue);

, но выдает исключение "Невозможно неявно скрыть тип IOrderedEnumerable в TrackableCollection.

Кто-нибудь знает, как отсортировать TrackableCollection?

Ответы [ 3 ]

2 голосов
/ 15 июля 2011

Пример кода, на который ссылается Шив Кумар, не работает - он не компилируется, и даже после того, как вы разберетесь (как, например, реализуете дженерики во многих местах), он работает, но с ошибками, поскольку код вызывает collection.Move в некоторых случаях возникает исключение «Индекс должен находиться в границах списка». Код ниже работает правильно. Кодировщики STE (Self Tracking Entities) должны были реализовать это сами ... Это правильный код:

    public static class Extensions
{
    public static void Sort<T>(this TrackableCollection<T> collection, Comparison<T> comparison)
    {
        var comparer = new Comparer<T>(comparison);
        List<T> sorted = collection.OrderBy(x=>x, comparer) .ToList();

        collection.Clear();
        for (int i = 0; i < sorted.Count(); i++)
            collection.Add(sorted[i]);
    }
}

class Comparer<T> : IComparer<T>
{
    private Comparison<T> comparison;
    public Comparer(Comparison<T> comparison)
    {
        this.comparison = comparison;
    }

    public int Compare(T x, T y)
    {
        return comparison.Invoke(x, y);
    }
}

Вы используете этот код как в предыдущем примере:

YourTrackableCollectionName.Sort((x, y) => x.YourFieldName.CompareTo(y.YourFieldName));
1 голос
/ 04 февраля 2011
0 голосов
/ 28 октября 2011

Это упрощенная версия кода Ofer Zeligs, в которой вместо явного делегата Comparison используется функция keySelector (например, LINQ OrderBy).Поскольку он использует только Clear () и Add (), он может быть вызван для любого Collection объекта (например, ObservableCollection или TrackableCollection).

public static void Sort<TSource, TKey>(this Collection<TSource> source, Func<TSource, TKey> keySelector)
{
    var sorted = source.OrderBy(keySelector).ToList();

    source.Clear();
    foreach (var item in sorted)
        source.Add(item);
}

Используется так:

list.Sort(person => person.Name);

Если вы используете это на TrackableCollection (STE), вы можете убедиться, что вы не начали отслеживать изменения перед сортировкой списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...