当我发现没有直接的方法对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)
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)