为什么IList <T>没有排序?!?!(编辑)的

dew*_*ald 10 .net c# c#-4.0

当我发现没有直接的方法对IList <T>进行排序或执行二进制搜索时,我感到非常惊讶.就像有一些静态方法来对数组进行排序和执行二进制搜索一样,我认为使用类似于IList <T>的静态方法会非常有用.

目前:

class Array
{
    static Sort<T>(T[] array);
    static int BinarySearch<T>(T[] array, T item);
}
Run Code Online (Sandbox Code Playgroud)

我希望他们会补充:

class List
{
    static Sort<T>(IList<T> list);
    static int BinarySearch<T>(IList<T> list, T item);
}
Run Code Online (Sandbox Code Playgroud)

我瞥了一眼.NET Framework 4.0 Beta SDK,但似乎仍然没有解决这个问题的方法.

我知道我可以通过创建一个扩展方法来解决这个问题,该方法检查它是否是List <T>然后使用List <T>实例进行排序/搜索; 但是,如果它不是List <T>的实例,那么我必须执行一个副本(对于非常大的列表很臭).我知道我可以做到这一切,但为什么呢?他们故意遗漏这个功能有什么理由吗?

为了尝试在.NET 4.0 Framework中实现这一点,我通过Microsoft的Connect程序创建了一个建议.如果你像我这样对这个问题感到沮丧,那就投票吧,也许它会被添加.

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=474201

Jud*_*ngo 17

LINQ有一个OrderBy方法,适用于所有IEnumerable <T>,包括IList <T>.你可以使用OrderBy完成同样的事情.

// Order a list of addresses:
IList<string> list = ...
var orderedList = list.OrderBy(input => input);
Run Code Online (Sandbox Code Playgroud)

  • @dewald - 我认为一般规则是LINQ-to-Objects操作符"对于大多数用途来说都是懒惰的".鉴于一些IEnumerable实现可能是懒惰的,让OrderBy通过输入重复枚举寻找连续较低的值将是非常浪费的.也就是说,如果我正确阅读,它会使用EnumerableSorter <T> .QuickSort,即.基于数组的QuickSort实现. (3认同)
  • 如果你担心排序是立即的还是懒惰的,那么使用list.OrderBy(...).ToList()代替list.OrderBy(...),它将强制排序立即发生. (2认同)

lom*_*axx 10

我认为不包括排序方法是一个很好的例子IList<T>.首先,它会为那些想要实现IList的人带来额外的复杂性,其次会使IList接口更难以符合接口隔离原则.

一般来说,如果我需要对a执行排序,我IList<T>会创建一个新的List<T>并传入IList<T>作为参数

例如:

        public IList<Address> SortAddresses(IList<Address> addresses)
        {
            var sortedAddresses = new List<Address>(addresses);
            sortedAddresses.Sort();
            return sortedAddresses;
        }
Run Code Online (Sandbox Code Playgroud)

  • @lomaxx:如何为实现IList <>的类创建额外的复杂性?索引get/set属性已经存在,并且可以简单地在静态Sort(List <T>)方法中使用. (3认同)
  • @dewald:因为要写的代码更多,所以对每种类型的集合进行排序都没有意义. (3认同)
  • 他不是在接口上要求排序成员函数,而是在其他地方要求静态函数,将IList作为参数.这不会增加实施IList的人的复杂性. (3认同)