2009-07-02 54 views
7

谁能帮助..我有一个通用的列表,像这样使用存储在另一个列表(C#)中的自定义顺序对列表<>进行排序?

IList<itemTp> itemTps; 

itemTp基本上是一个类(有许多属性),并就这一个属性是“代码”

我需要能够按照我在另一个列表中设置的特定顺序对其进行排序。

这个列表是一个简单的列表,其中列出的顺序(从第一个开始到最后一个)喜欢说

代码1 CODE3 码2 代码4 (注意它会从1到3比2,以5 - 这些都是名称,他们可以被称为任何东西..重要的是订单,它与数字没有任何关系)

基本上我需要确保itemTp中的项目根据其他列表中的内容进行排序...

所以想象我ILIST是这样的代码1,代码2,CODE3,代码4 - 所以一旦排序是在做 我

 IList<itemTp> 

将包含4类,是为了和有像编码1,CODE3,CODE2,代码4财产(订单更改)

任何想法如何做到这一点?

回答

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)); 
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>的实施中。

如果您需要在单独的列表中对其进行排序,则可以通过首先创建数组来使用上述逻辑。

+0

阵列。排序不适用于通用IList 2009-07-02 21:16:50

+0

是的..我只是想比较。这是它:http://stackoverflow.com/questions/15486/sorting-an-ilist-in-c – Groo 2009-07-02 21:22:01

0

使用C#3和LINQ to对象,我只想创造,而不是试图梳理现有的一个新的列表:

void Example() 
{ 
    IList<string> codes; 
    IList<ItemTp> itemTps; 
    itemTps = codes.Select(code => itemTps.Single(itp => itp.Code == code)).ToList(); 
} 
相关问题