如何对TrackableCollection进行排序?

时间:2011-02-04 16:31:49

标签: c# entity-framework

我有一个实体框架'TrackableCollection',我想按属性对其进行排序。我试过像IEnumerable一样对待它并调用

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

但它抛出异常“无法隐式隐藏类型IOrderedEnumerable到TrackableCollection。

任何人都知道如何对TrackableCollection进行排序?

3 个答案:

答案 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对象上调用它(如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);
}

它的使用方式如下:

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

如果您在TrackableCollection(STE)上使用此功能,则可能需要确保在排序列表之前尚未开始跟踪更改。