2011-02-04 74 views
1

我有一个实体框架'TrackableCollection',我想按属性对它进行排序。我曾尝试处理它像一个IEnumerable,并呼吁如何对TrackableCollection进行排序?

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

但它抛出一个异常“不能隐式隐蔽型IOrderedEnumerable到TrackableCollection。

任何人都知道如何排序TrackableCollection?

回答

2

代码示例Shiv Kumar指的不起作用 - 它不能编译,甚至在你将因素考虑在内之后(比如实现基因因为代码调用collection.Move,在某些情况下会导致“索引必须在列表的范围内”异常。 下面的代码正常工作。 STE的编码器(自动跟踪实体)应该已经实施了自己......这是正确的代码:

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

这是一个使用keySelector函数的Ofer Zeligs代码的简化版本(如LINQ OrderBy),而不是明确的Comparison委托。由于它只使用Clear()和Add(),因此可以在任何对象(如ObservableCollectionTrackableCollection)上调用它。

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); 
} 

它这样使用:如果您在使用本上TrackableCollection(STE)

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

你可能想确保你还没有开始跟踪列表进行排序,之前的变化。