寻求允许自定义排序方法的类

时间:2009-04-13 19:52:26

标签: c# .net sorting .net-2.0

我写了一个小应用程序,它允许我比较两个数据库模式以检查结构的差异。它一直到列详细信息,这很好。当我比较非常小的数据库时,我没有遇到任何问题,但是当我开始将数据库与数百个表进行比较时,向上和向下滚动以找出错误的位置是很烦人的。最初,我使用KeyedCollection来保存表的列表,但由于它不允许任何类型的排序,我已经改为SortedList。 SortedList会对索引进行排序,这会按字母顺序给出表格,但这比我需要的要少。我需要的是一个允许我根据对象属性进行排序的类,而不仅仅是索引值。为了方便起见,我想把有错误的表推到列表的开头。任何人都知道我可以用哪个类来完成这个任务?

EDIT1:List类没有索引,这对我的班级来说至关重要。我尝试使用Dictionary,它有一个索引,但没有sort方法。实现IComparer不起作用,因为构造函数只接受索引类型的IComparer。由于IComparer是另一个无法访问我的列表类的内部值列表的类,我无法根据对象属性进行比较。

EDIT2:我需要一个按对象属性对索引进行排序的类,而不是索引值,但我开始相信这个类不存在。

4 个答案:

答案 0 :(得分:2)

然后你需要创建一个类来实现 System.Collections.Generic.IComparer ,然后你可以把你的所有对象放到一个支持基于IComparer的排序的集合中,例如:

System.Collections.Generic.List允许您根据自己的实现进行排序。

这是一个link,可以帮助您理解这一点。

答案 1 :(得分:0)

使用this重载构造函数构造SortedList,并使用您实现的自定义IComparer类对您的方式进行排序。

答案 2 :(得分:0)

如果您要做的就是创建自己的排序,那么这可能是最简单的:

List<Foo> myFoos = new List<Foo>();
//--Write code to fill the list

//sort by ID
myFoos.Sort(delegate(Foo foo1, Foo foo2)
{
    return foo1.ID.CompareTo(foo2.ID);
});

//Sort by Last Name
myFoos.Sort(delegate(Foo foo1, Foo foo2)
{
    return foo1.LastName.CompareTo(foo2.LastName);
});

如果您不想使用匿名方法并希望在多个位置使用相同类型的排序,您也可以这样做:

public class FooIDCompare : IComparer<Foo>
    {
        #region IComparer<foo> Members

        public int Compare(Foo x, Foo y)
        {
            return x.ID.CompareTo(y.ID);
        }

        #endregion
    }

FooIDCompare idCompare = new FooIDCompare();
myFoos.Sort(idCompare);

答案 3 :(得分:0)

没有简单的方法可以做到这一点。也许甚至不是一个艰难的方式。由于它本来是用来输出的,所以我决定用多个部分输出循环来达到我想要的结果。