我有一个IList
我需要排序的,如果可能的话我宁愿不复制列表.我注意到ArrayList
有一个Adapter
静态方法包装传递的列表而不复制它,但这需要一个IList
,我有一个IList
.从a转换System.Collections.Generic.IList
为a System.Collections.IList
并且只使用该Adapter
方法是否安全?
请注意,这是.Net 2.0,因此LINQ不是一个选项.
在Paul Fox的博客中,我推荐帖子"如何排序IList":http://foxsys.blogspot.com/2007/06/how-to-sort-generic-ilist.html
为了防止博客将来消失,我会在这里复制帖子:
如何对通用IList进行排序
更新
您可以阅读和更新有关排序通用IList和List的帖子.很多人会更喜欢更新帖子中提到的方法.
对通用IList进行排序
我试图对一个通用的IList <>进行排序,并找到了一种相当简单的方法.
步骤1
您需要为IList中包含的类型实现IComparable.对于这个例子,我将使用一个简单的语言Dto类.
public class LanguageDto : IComparable { private String name; public string Name { get { return name; } set { name = value; } } public LanguageDto(string name) { this.name = name; } #region IComparable Members public int CompareTo(object obj) { if (obj is LanguageDto) { LanguageDto language = (LanguageDto)obj; return this.name.CompareTo(language.name); } throw new ArgumentException(string.Format("Cannot compare a LanguageDto to an {0}", obj.GetType().ToString())); } #endregion }
第2步
排序您的IList.为此,您将使用传入IList的ArrayList.Adapter()方法,然后调用Sort方法.像这样......
ArrayList.Adapter((IList)languages).Sort();
注意:语言类型为"IList"
语言应该是您的类型的排序列表!
你不能将IList(T)强制转换为IList.
在使用Reflector进行一些嗅探之后,看起来像ArrayList.Adapter(IList).Sort()将首先将列表复制到对象数组,对数组进行排序,然后将数组复制回列表:
object[] array = new object[count]; this.CopyTo(index, array, 0, count); Array.Sort(array, 0, count, comparer); for (int i = 0; i < count; i++) { this._list[i + index] = array[i]; }
如果List(T)中的T为值类型,则可能会导致拳击开销.
如果您需要更改列表中对象的顺序,则可以类似地执行此操作:
IList
如果列表是如此巨大(如数以亿计的项目),你无法在内存中制作额外的副本,我建议首先使用List(T)或实现您最喜欢的就地排序算法.