我有一个实体框架'TrackableCollection',我想按属性对其进行排序。我试过像IEnumerable一样对待它并调用
TrackableCollection<Something>.OrderBy(q=>q.SomeValue);
但它抛出异常“无法隐式隐藏类型IOrderedEnumerable到TrackableCollection。
任何人都知道如何对TrackableCollection进行排序?
答案 0 :(得分: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));
答案 1 :(得分:1)
答案 2 :(得分:0)
这是Ofer Zeligs代码的简化版本,它使用keySelector func(如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
(STE)上使用此功能,则可能需要确保在排序列表之前尚未开始跟踪更改。