当前位置:  开发笔记 > 前端 > 正文

在.Net 2.0中对IList <T>进行排序的最佳方法是什么?

如何解决《在.Net2.0中对IList<T>进行排序的最佳方法是什么?》经验,为你挑选了2个好方法。

我有一个IList我需要排序的,如果可能的话我宁愿不复制列表.我注意到ArrayList有一个Adapter静态方法包装传递的列表而不复制它,但这需要一个IList,我有一个IList.从a转换System.Collections.Generic.IList为a System.Collections.IList并且只使用该Adapter方法是否安全?

请注意,这是.Net 2.0,因此LINQ不是一个选项.



1> Mike C...:

在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 转换为IList.为什么这是一个安全的演员?

2> Hallgrim..:

你不能将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 unsorted = ...
List sorted = new List(unsorted);
sorted.Sort(); 
for (int i = 0; i < unsorted.Countt; i++)
{
    unsorted[i] = sorted[i];
}


如果列表是如此巨大(如数以亿计的项目),你无法在内存中制作额外的副本,我建议首先使用List(T)或实现您最喜欢的就地排序算法.

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有