我有一个实体框架'TrackableCollection',我想按属性对它进行排序。我曾尝试处理它像一个IEnumerable,并呼吁如何对TrackableCollection进行排序?
TrackableCollection<Something>.OrderBy(q=>q.SomeValue);
但它抛出一个异常“不能隐式隐蔽型IOrderedEnumerable到TrackableCollection。
任何人都知道如何排序TrackableCollection?
我有一个实体框架'TrackableCollection',我想按属性对它进行排序。我曾尝试处理它像一个IEnumerable,并呼吁如何对TrackableCollection进行排序?
TrackableCollection<Something>.OrderBy(q=>q.SomeValue);
但它抛出一个异常“不能隐式隐蔽型IOrderedEnumerable到TrackableCollection。
任何人都知道如何排序TrackableCollection?
代码示例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));
这是一个使用keySelector函数的Ofer Zeligs代码的简化版本(如LINQ OrderBy
),而不是明确的Comparison
委托。由于它只使用Clear()和Add(),因此可以在任何对象(如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);
}
它这样使用:如果您在使用本上TrackableCollection
(STE)
list.Sort(person => person.Name);
你可能想确保你还没有开始跟踪列表进行排序,之前的变化。
此链接不再有效。 – 2012-12-27 06:15:42