可能重复:
Sorting an IList in C#
我有以下方法,我需要对传递给它的iList对象进行排序(在此方法中)。我尝试过linq但是因为它是一个界面我会收到错误。
提前致谢
private void AddListToTree(ComponentArt.Web.UI.TreeView treeView, IList list)
{
//NEED TO SORT THE LIST HERE
}
请注意我的类型是动态的。
我想我应该创建一个临时集合,从我的IList实例填充,对它进行排序,获取支持IList的对象的适当实例,并使用它而不是我应该保留的IList的非排序实例。 所以我试着得到如下类型:
Type[] listTypes = list.GetType().GetGenericArguments();
Type listType = null;
if (listTypes.Length > 0)
{
listType = listTypes[0];
}
但我无法使用此类型创建新的列表
答案 0 :(得分:8)
您应该使用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);
// ...
}
答案 1 :(得分:1)
您可以使用Cast<T>()
将其更改为IList<T>
,然后使用OrderBy()
:
private void AddListToTree<T>(ComponentArt.Web.UI.TreeView treeView, IList list)
{
var ordered = list.Cast<T>().OrderBy(e => e);
}
在某个地方,您需要知道要进行排序的类型。
答案 2 :(得分:1)
对于LINQ: 重复的问题为:Sorting an IList in C#
您还可以使用扩展方法将排序命令添加到IList:Why is there no Sort for IList<T>?!?! (edited)'
您可以执行以下操作(我不认可,但它仍然可行)
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
答案 3 :(得分:1)
一种方法(请注意,您必须在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);
}
打印:
a c z
注意:根据您之后的评论
它们可以是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>());
答案 4 :(得分:0)
一种选择是使用ArrayList.Adapter在IList周围创建一个ArrayList适配器,然后使用ArrayList.Sort对其进行排序。这是因为您需要一个可以改变数组内容的就地排序操作,而不是返回一个已排序的枚举。
答案 5 :(得分:0)