任何人都可以提供帮助..我有一个像这样的通用列表
IList<itemTp> itemTps;
itemTp基本上是一个类(有许多属性),其中一个属性就是“代码”
我需要能够将其在另一个列表中设置的特定订单排序。
这个列表是一个简单的列表,列出了顺序(从头到尾),比如说
CODE1 CODE3 码2 代码4 (注意它从1到3到2到5 - 这些是名字,它们可以被称为任何东西......重要的是订单,它与数字没有任何关系)
基本上我需要确保itemTp中的项目按照其他列表中的内容进行排序...
所以想象一下我的Ilist就像这个code1,code2,code3,code5 - 所以一旦完成排序 在我的
IList<itemTp>
将包含4个按顺序排列的类,并具有类似code1,code3,code2,code5(订单更改)的属性
任何想法如何做到这一点?
答案 0 :(得分:9)
您需要创建一个IComparer,它将根据您的其他列表的状态比较项目。使用IComparer的优点是,如果需要优化,您将能够在类中构建缓存逻辑,以避免重复的IndexOf()查找。此外,您将能够维护多个可在适当时使用的“其他”列表。
class ItemTpComparer : IComparer<itemTp>
{
private IList<codeTp> otherList;
public ItemTpComparer(IList<codeTp> otherList)
{
this.otherList = otherList;
}
public int Compare(itemTp a, itemTp b)
{
return otherList.IndexOf(a.Code) - otherList.IndexOf(b.Code);
}
}
并执行排序:
myList.Sort(new ItemTpComparer(otherList));
答案 1 :(得分:0)
很抱歉,如果出现问题,我这里没有安装C#编辑器,但它是这样的:
Array.Sort(
itemTps,
delegate(ItemTp a, ItemTp b)
{
return secondList.IndexOf(a.Code) - secondList.IndexOf(b.Code);
});
注意:它可能不是最有效的方式,也没有检查第二个列表是否包含代码。
[编辑] 正如Mehrdad所说,Array.Sort
不适用于通用IList<T>
。要对数组进行排序,您需要使用ArrayList.Adapter
方法创建包装器,然后对其进行排序。由于ArrayList.Sort
不支持委托比较,因此您需要将匿名委托放在IComparer<T>
的实现中。
如果您需要在单独的列表中对其进行排序,那么首先通过创建数组来使用上述逻辑是有意义的。
答案 2 :(得分:0)
使用C#3和LINQ to Objects,我只想创建一个新列表而不是尝试对现有列表进行排序:
void Example()
{
IList<string> codes;
IList<ItemTp> itemTps;
itemTps = codes.Select(code => itemTps.Single(itp => itp.Code == code)).ToList();
}