我想实现一些各种算法进行练习,只是为了看看我到底有多糟糕并变得更好:p

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

但是除了使用OrderBy和ThenBy扩展方法外,我找不到其他方法返回IOrderedEnumerable<T>实例。所以我想我必须创建自己的实现该接口(interface)的类。但是说实话,该界面对我而言并不太有意义。可能可以,但我不确定。

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

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方法。这到底意味着什么?好吧,我想当然会创建一个有序的枚举,但是如何?排序算法本身应该放在那里吗?那会怎样呢?没有收集到该方法的项目集合,那么按顺序订购该集合意味着什么呢?您将如何使用类(class)?例如,是否需要将其实现为需要分类的东西中的私有(private)帮助器类?

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

哈哈,刚发现我刚才问过类似的问题here。但这只是可能返回一个。所以我想这个问题是对我到达那里的一个答案的回应=)

最佳答案

我有一个sample implementation,您可以看一下。它并不是为了提高效率而设计的,但是它应该可以帮助您入门。

基本上,IOrderedEnumerable<T>只需了解其当前顺序即可,因此可以创建一个新的。假设您已经有一个IComparer<T>,则可以通过说类似以下内容来构建一个新的ReverseComparer:

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中已经存在的三个不同类表示了三个不同方面:
  • IComparer<T>:反转现有LinkedComparer的结果
  • ProjectionComparer:从两个创建一个比较器,其中一个主控器和一个从属
  • ojit_code:基于从原始项到键的投影创建一个比较器,委托(delegate)另一个比较器比较那些键。

  • 比较器非常适合像这样链接在一起。

    关于c# - C#:如何实现IOrderedEnumerable <T>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1234901/

    10-10 05:00