2011-02-04 3 views
1

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

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

но бросает исключение «Не удается неявно скрытого типа IOrderedEnumerable в TrackableCollection.

Каждый знает, как сортировать TrackableCollection?

ответ

2

Пример кода Шив Кумар ссылается на то, что он не работает - он не компилируется и даже после того, как вы меняете вещи (например, внедряя ген rics во многих местах), он работает, но глючит, так как код вызывает collection.Move, который вызывает в некоторых случаях исключение «Index должно быть в пределах списка». Код ниже работает правильно. Кодеры СТЭ (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)); 
0

Это упрощенная версия кода Ofer Zeligs, которая использует функцию keySelector (например, LINQ OrderBy) вместо явного делегата Comparison. Поскольку он использует только 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 (СТЭ), вы можете убедиться, что вы не начали отслеживать изменения до сортировки списка.