对 IList进行排序
本文关键字:排序 IList | 更新日期: 2023-09-27 17:57:18
如果我有一个List<T>
,我可以在适当的位置排序,
myList.Sort((x,y) => x.MyComparisonMethod(y));
如果我有IList<T>
,我可以使用
var sortedIList = unsortedIList.OrderBy(x => x.SortingValue);
如何就地对IList<T>
进行排序?
我正在使用 C# .NET 4.5.1。
使用 ArrayList.Adapter 作为包装器编写您自己的扩展方法IList<T>
并从某个比较委托开始编写您自己的CustomComparer
:
public static class IListExtensions
{
public static void Sort<T>(this IList<T> list, Comparison<T> comparison)
{
ArrayList.Adapter((IList)list).Sort(new CustomComparer<T>(comparison));
}
}
"我可以使用"不,事实并非如此,OrderBy
不返回列表,则必须调用ToList
才能创建新列表。您的问题是如何将List.Sort
与IList<T>
一起使用而不是List<T>
?
您可以为IList<T>
编写扩展方法:
public static IList<T> Sort<T>(this IEnumerable<T> sequence, IComparer<T> comparer = null)
{
var seqList = sequence as List<T>;
if (seqList != null)
{
seqList.Sort((IComparer<T>)comparer);
return seqList;
}
var seqArray = sequence as T[];
if (seqArray != null)
{
Array.Sort(seqArray, (IComparer<T>)comparer);
return seqArray;
}
return sequence.OrderBy(t => t, (IComparer<T>)comparer).ToList();
}
现在,您可以在列表、数组或任何其他类型的序列上使用Sort
:
IList<string> strings = new[] { "B", "A", "C" };
strings.Sort();
更新:如果您只想为数组或列表提供一个,您可以使用:
public static void Sort<T>(this IList<T> sequence, IComparer<T> comparer = null)
{
var seqList = sequence as List<T>;
if (seqList != null)
{
seqList.Sort((IComparer<T>)comparer);
return;
}
var seqArray = sequence as T[];
if (seqArray != null)
{
Array.Sort(seqArray, (IComparer<T>)comparer);
}
}
我怀疑你指的是你的OrderBy
不会编译的事实。那是因为它返回一个IOrderedEnumerable
,这不是一个IList
,你必须在之后执行ToList()
才能将其转换回IList
实现:
var sortedIList = unsortedIList.OrderBy(x => x.SortingValue).ToList();
如果您想使用自己的IComparer
:
var sortedIList = unsortedIList.OrderBy(x => x.SortingValue, new MyComparer()).ToList();