Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在查找允许自定义排序方法的类_C#_.net_Sorting_.net 2.0 - Fatal编程技术网

C# 正在查找允许自定义排序方法的类

C# 正在查找允许自定义排序方法的类,c#,.net,sorting,.net-2.0,C#,.net,Sorting,.net 2.0,我编写了一个小应用程序,它允许我比较两个数据库模式,以检查结构上的差异。它一直延伸到专栏细节,这很好。当我比较非常小的数据库时,我没有遇到任何问题,但是当我开始比较具有数百个表的数据库时,上下滚动以查找错误的位置是很烦人的。最初,我使用KeyedCollection保存表的列表,但由于它不允许任何类型的排序,因此我改为SortedList。SortedList会对索引进行排序,这会按字母顺序为我提供表,但这比我需要的要少。我需要的是一个类,它允许我根据对象属性而不仅仅是索引值进行排序。为了便于使

我编写了一个小应用程序,它允许我比较两个数据库模式,以检查结构上的差异。它一直延伸到专栏细节,这很好。当我比较非常小的数据库时,我没有遇到任何问题,但是当我开始比较具有数百个表的数据库时,上下滚动以查找错误的位置是很烦人的。最初,我使用KeyedCollection保存表的列表,但由于它不允许任何类型的排序,因此我改为SortedList。SortedList会对索引进行排序,这会按字母顺序为我提供表,但这比我需要的要少。我需要的是一个类,它允许我根据对象属性而不仅仅是索引值进行排序。为了便于使用,我想把有错误的表推到列表的最前面。有人知道我可以用哪门课来完成这个任务吗

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


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

使用重载构造函数和自定义类构造SortedList,您可以实现自定义类来对其进行排序。

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

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


这里有一个很好的例子来帮助您理解这一点。

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

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);
});
List myFoos=new List();
//--编写代码来填充列表
//按ID排序
排序(委托(Foo-foo1,Foo-foo2)
{
返回foo1.ID.CompareTo(foo2.ID);
});
//按姓氏排序
排序(委托(Foo-foo1,Foo-foo2)
{
返回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);
公共类FooIDCompare:IComparer
{
#地区I比较成员
公共整数比较(Foo x,Foo y)
{
返回x.ID.CompareTo(y.ID);
}
#端区
}
FooIDCompare-idCompare=新的FooIDCompare();
myFoos.Sort(idCompare);

要做到这一点,没有简单的方法。也许不难。因为它是用来生成输出的,所以我决定生成多个部分输出循环,以达到我想要的结果