首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#:如何实现IOrderedEnumerable<T>

C#:如何实现IOrderedEnumerable<T>
EN

Stack Overflow用户
提问于 2009-08-05 18:23:10
回答 2查看 11.3K关注 0票数 16

我想为实践实现一些不同的算法,只是为了看看我到底有多糟糕,并变得更好:p

无论如何,我想我会尝试使用IEnumerable<T>IOrderedEnumerable<T>以及其他.Net集合类型来兼容(以便以后可以更容易地使用我编写的内容)。

但是,除了使用IOrderedEnumerable<T>和ThenBy扩展方法之外,我找不到返回OrderBy实例的方法。所以我想我必须创建自己的类来实现这个接口。但是这个界面对我来说不太有意义。可能,但我不确定。

我创建了一个空类,添加了接口,然后让ReSharper为我添加空实现。看起来是这样的:

代码语言:javascript
复制
class MyOrderedEnumerable<T> : IOrderedEnumerable<T>
{
    /// <summary>
    /// Performs a subsequent ordering on the elements of an <see cref="T:System.Linq.IOrderedEnumerable`1"/> according to a key.
    /// </summary>
    /// <returns>
    /// An <see cref="T:System.Linq.IOrderedEnumerable`1"/> whose elements are sorted according to a key.
    /// </returns>
    /// <param name="keySelector">The <see cref="T:System.Func`2"/> used to extract the key for each element.</param><param name="comparer">The <see cref="T:System.Collections.Generic.IComparer`1"/> used to compare keys for placement in the returned sequence.</param><param name="descending">true to sort the elements in descending order; false to sort the elements in ascending order.</param><typeparam name="TKey">The type of the key produced by <paramref name="keySelector"/>.</typeparam><filterpriority>2</filterpriority>
    public IOrderedEnumerable<T> CreateOrderedEnumerable<TKey>(Func<T, TKey> keySelector, IComparer<TKey> comparer, bool descending)
    {
        throw new NotImplementedException();
    }

    /// <summary>
    /// Returns an enumerator that iterates through the collection.
    /// </summary>
    /// <returns>
    /// A <see cref="T:System.Collections.Generic.IEnumerator`1"/> that can be used to iterate through the collection.
    /// </returns>
    /// <filterpriority>1</filterpriority>
    public IEnumerator<T> GetEnumerator()
    {
        throw new NotImplementedException();
    }

    /// <summary>
    /// Returns an enumerator that iterates through a collection.
    /// </summary>
    /// <returns>
    /// An <see cref="T:System.Collections.IEnumerator"/> object that can be used to iterate through the collection.
    /// </returns>
    /// <filterpriority>2</filterpriority>
    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

我不明白的是CreateOrderedEnumerable方法。它到底意味着什么?嗯,我想它当然会创建一个有序的可枚举的,但是如何?排序算法本身应该在那里吗?它会是什么样的呢?没有进入该方法的项的集合,那么它在哪里使集合被订购呢?你怎么用这门课?它是否意味着要实现,例如,需要对事物进行排序的东西中的私有助手类?

然后,与MyOrderedEnumerable<T> : IOrderedEnumerable<T>不同,您可能有一个QuickSorter<T> : IOrderedEnumerable<T>,它在构造函数中获取集合,并在调用CreateOrderedEnumerable方法时对其进行排序.但是,如果有人在调用该方法之前调用了GetEnumerator并开始枚举,那么会发生什么呢?

哈哈,这里刚刚发现我问过类似的问题。但这仅仅是如果有可能的话,返回一个。所以我想这个问题是对我得到的唯一答案的回答

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-05 18:25:35

我有一个你可以看的样本实现。它不是以任何方式被设计成高效的,但它应该会让你开始。

基本上,一个IOrderedEnumerable<T>只需要对它当前的顺序有一个概念,这样它就可以创建一个新的排序。假设您已经有了一个IComparer<T>,您可以通过这样的语句构建一个新的:

代码语言:javascript
复制
int Compare(T first, T second)
{
    if (baseComparer != null)
    {
        int baseResult = baseComparer.Compare(first, second);
        if (baseResult != 0)
        {
            return baseResult;
        }
    }
    TKey firstKey = keySelector(first);
    TKey secondKey = keySelector(second);

    return comparer.Compare(firstKey, secondKey);        
}

基本上,您创建了一个比较器链,从“最不重要的”到“最重要的”。您还需要在其中放置“下降”位,但这很简单:)

在上面链接的示例中,三个不同的方面在MiscUtil中已经存在的三个不同类中表示。

  • ReverseComparer:逆转现有IComparer<T>的结果
  • LinkedComparer:从两个中创建一个比较器,其中一个主和一个从
  • ProjectionComparer:根据从原始项到键的投影创建一个比较器,委托另一个比较者来比较这些键。

比较器很适合像这样链接在一起。

票数 13
EN

Stack Overflow用户

发布于 2012-03-04 19:56:43

您的类可能会有一些实现IEnumerable (例如List<T>)的内部存储变量。在这种情况下,这种方法的实现很简单:

代码语言:javascript
复制
private List<T> data = new List<T>();

public IOrderedEnumerable<CalculationResult> CreateOrderedEnumerable<TKey>(Func<CalculationResult, TKey> keySelector, IComparer<TKey> comparer, bool descending)
{
  return descending ? 
      data.OrderByDescending(keySelector, comparer) 
    : data.OrderBy(keySelector, comparer);
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1234901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档