对列表进行排序<>使用我的自定义订单存储在另一个列表(C#)中?

时间:2009-07-02 21:09:23

标签: c# .net visual-studio sorting

任何人都可以提供帮助..我有一个像这样的通用列表

    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(订单更改)的属性

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

3 个答案:

答案 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();
}