我想实现一些各种算法进行练习,只是为了看看我到底有多糟糕并变得更好: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
:从两个创建一个比较器,其中一个主控器和一个从属比较器非常适合像这样链接在一起。
关于c# - C#:如何实现IOrderedEnumerable <T>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1234901/