如何对iList进行排序(带linq或不带linq)

本文关键字:linq 排序 iList | 更新日期: 2023-09-27 18:15:54

可能重复:
在C#中对IList进行排序

我有下面的方法,我需要对传递给它的iList对象进行排序(在这个方法内部(。我试过linq,但由于它是一个接口,我会出错。

提前感谢

private void AddListToTree(ComponentArt.Web.UI.TreeView treeView, IList list)
{
//NEED TO SORT THE LIST HERE
}

请注意,我的类型是动态。

我认为我应该创建一个临时集合,从我的IList实例中填充if,对它进行排序,获得支持IList的对象的适当实例,并使用它来代替我的未排序的IList示例,我应该保持原样。所以我试着得到如下类型:

Type[] listTypes = list.GetType().GetGenericArguments();
Type listType = null;
if (listTypes.Length > 0)
{
listType = listTypes[0];
}

但是我不能用创建一个新的列表

如何对iList进行排序(带linq或不带linq)

您应该使用IList的通用形式才能使用LINQ扩展方法:

private void AddListToTree<T>(ComponentArt.Web.UI.TreeView treeView,
                              IList<T> list)
{
    var orderedList = list.OrderBy(t => t);
    // ...
}

如果您不能修改方法的签名,但您知道IList中对象的类型,则可以使用Cast:

private void AddListToTree(ComponentArt.Web.UI.TreeView treeView,
                           IList list)
{
    var orderedList = list.Cast<SomeType>().OrderBy(x => x);
    // ...
}

对于LINQ:重复问题为:在C#中对IList进行排序

您还可以使用扩展方法将Sort命令添加到IList:为什么没有Sort for IList<T>?!?!(编辑('

你可以做以下(WhicH我不支持,但它仍然可行(

IList list;
ArrayList al = new ArrayList(list);
al.Sort();

您还可以使用IComparable:http://devpinoy.org/blogs/keithrull/archive/2007/03/23/sorting-a-generic-list-of-object-in-c-using-icomparable-and-anonymous-delegates.aspx

http://foxsys.blogspot.com/2007/06/how-to-sort-generic-ilist.html

您可以使用Cast<T>()将其更改为IList<T>,然后使用OrderBy():

private void AddListToTree<T>(ComponentArt.Web.UI.TreeView treeView, IList list)
{
    var ordered = list.Cast<T>().OrderBy(e => e);
}

在某个地方,你需要知道进行排序的类型。

单向(注意,您必须在from子句中指定项类型(:

IList list = new ArrayList();
list.Add("z");
list.Add("a");
list.Add("c");
IEnumerable<string> ordered =
    from string item in list
    orderby item
    select item;
foreach (var s in ordered)
{
    Console.WriteLine(s);
}

打印:

acz

注:根据您稍后对的评论

它们可以是3种不同类别的

这是行不通的。我会认真考虑重构调用代码。

如果你没有能力编辑类型,并且类型不应该在排序列表中混合,这里有一个选项:

var one = list.OfType<TypeOne>().OrderBy(x => x.Id);
var two = list.OfType<TypeTwo>().OrderBy(x => x.Name);
var three = list.OfType<TypeThree>().OrderBy(x => x.Nom);
var result =
    one.Cast<object>()
    .Concat(two.Cast<object>())
    .Concat(three.Cast<object>());

一个选项是使用ArrayList.adapter在IList周围创建一个ArrayList适配器,然后使用ArrayList.sort对其进行排序。这是因为您需要一个原位排序操作来更改数组内容,而不是返回已排序的枚举。

如果不能更改签名或使用LINQ,请使用扩展方法或自定义方法。

@Ryan Ternier列出的重复问题中给出的例子:

LINQ:问题重复为:在C#中对IList进行排序