我有一个IList<T>我需要排序的,如果可能的话我宁愿不复制列表.我注意到ArrayList有一个Adapter静态方法包装传递的列表而不复制它,但这需要一个IList,我有一个IList<T>.从a转换System.Collections.Generic.IList<T>为a System.Collections.IList并且只使用该Adapter方法是否安全?
请注意,这是.Net 2.0,因此LINQ不是一个选项.
Mik*_* C. 13
在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
}
Run Code Online (Sandbox Code Playgroud)
第2步
排序您的IList.为此,您将使用传入IList的ArrayList.Adapter()方法,然后调用Sort方法.像这样......
ArrayList.Adapter((IList)languages).Sort();
Run Code Online (Sandbox Code Playgroud)
注意:语言类型为"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];
}
Run Code Online (Sandbox Code Playgroud)
如果List(T)中的T为值类型,则可能会导致拳击开销.
如果您需要更改列表中对象的顺序,则可以类似地执行此操作:
IList<object> unsorted = ...
List<object> sorted = new List<object>(unsorted);
sorted.Sort();
for (int i = 0; i < unsorted.Countt; i++)
{
unsorted[i] = sorted[i];
}
Run Code Online (Sandbox Code Playgroud)
如果列表是如此巨大(如数以亿计的项目),你无法在内存中制作额外的副本,我建议首先使用List(T)或实现您最喜欢的就地排序算法.
| 归档时间: |
|
| 查看次数: |
8058 次 |
| 最近记录: |