Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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列表按x然后y排序_C#_.net_Sorting - Fatal编程技术网

C# C列表按x然后y排序

C# C列表按x然后y排序,c#,.net,sorting,C#,.net,Sorting,与之类似,我们希望先按一个元素排序,然后按另一个元素排序。我们希望实现与 SELECT * from Table ORDER BY x, y 我们有一个包含许多排序函数的类,通过一个元素进行排序没有问题。 例如: public class MyClass { public int x; public int y; } List<MyClass> MyList; public void SortList() { MyList.Sort( MySor

与之类似,我们希望先按一个元素排序,然后按另一个元素排序。我们希望实现与

SELECT * from Table ORDER BY x, y  
我们有一个包含许多排序函数的类,通过一个元素进行排序没有问题。 例如:

public class MyClass {
    public int x;
    public int y;
}  

List<MyClass> MyList;

public void SortList() {
    MyList.Sort( MySortingFunction );
}

稳定排序更好,但不是必需的。欢迎使用适用于.Net 2.0的解决方案。

对于.Net版本,您可以使用LINQ OrderBy,然后根据需要使用降序:

using System.Linq;
....
List<SomeClass>() a;
List<SomeClass> b = a.OrderBy(x => x.x).ThenBy(x => x.y).ToList();

注意:对于.Net 2.0或如果您不能使用LINQ,请查看此问题。

请记住,如果比较所有成员,则不需要稳定排序。根据要求,2.0解决方案可以如下所示:

 public void SortList() {
     MyList.Sort(delegate(MyClass a, MyClass b)
     {
         int xdiff = a.x.CompareTo(b.x);
         if (xdiff != 0) return xdiff;
         else return a.y.CompareTo(b.y);
     });
 }

请注意,此2.0解决方案仍然优于流行的3.5 Linq解决方案,它执行就地排序,并且不具有Linq方法的On存储要求。当然,除非您希望原始列表对象保持不变。

技巧是实现稳定的排序。我创建了一个小部件类,它可以包含您的测试数据:

public class Widget : IComparable
{
    int x;
    int y;
    public int X
    {
        get { return x; }
        set { x = value; }
    }

    public int Y
    {
        get { return y; }
        set { y = value; }
    }

    public Widget(int argx, int argy)
    {
        x = argx;
        y = argy;
    }

    public int CompareTo(object obj)
    {
        int result = 1;
        if (obj != null && obj is Widget)
        {
            Widget w = obj as Widget;
            result = this.X.CompareTo(w.X);
        }
        return result;
    }

    static public int Compare(Widget x, Widget y)
    {
        int result = 1;
        if (x != null && y != null)                
        {                
            result = x.CompareTo(y);
        }
        return result;
    }
}
我实现了IComparable,因此它可以按List.Sort进行不稳定的排序

但是,我还实现了静态方法Compare,它可以作为委托传递给搜索方法

我借用了以下插入排序方法:

这可能会被一些匿名代表清理掉,但我会让你来决定


<>编辑:NoBugz展示了匿名方法的力量……所以,请考虑我的老学校:P

< P>我有一个问题,OrderBy和ThenBy没有给我想要的结果,或者我只是不知道如何正确地使用它们。p> 我用了一个列表,对解决方案排序如下

    var data = (from o in database.Orders Where o.ClientId.Equals(clientId) select new {
    OrderId = o.id,
    OrderDate = o.orderDate,
    OrderBoolean = (SomeClass.SomeFunction(o.orderBoolean) ? 1 : 0)
    });

    data.Sort((o1, o2) => (o2.OrderBoolean.CompareTo(o1.OrderBoolean) != 0
    o2.OrderBoolean.CompareTo(o1.OrderBoolean) : o1.OrderDate.Value.CompareTo(o2.OrderDate.Value)));
这可能会帮助你,

来自phoog的另一篇回复文章:它以新的顺序创建另一个包含原始项目的列表。这仅在您需要出于其他目的保留原始顺序时才有用;这比按顺序排列列表更浪费内存place@Bolu我已经明确删除了标签,使后版本不可知,并更新了答案,以匹配这一点。如果你认为4/2不够突出,请考虑在问题中做一个清晰的编辑。抱歉,AlexeiLevenkov,没有太多的注意,请随时翻转。好的。已还原更改。此问题已更新,以涵盖原始版本just 2.0中的所有.Net版本-包含针对不同框架和需求的多个备选答案-查看所有选项,以查看哪一个更适合您的需求。
 public static void InsertionSort<T>(IList<T> list, Comparison<T> comparison)
        {           
            int count = list.Count;
            for (int j = 1; j < count; j++)
            {
                T key = list[j];

                int i = j - 1;
                for (; i >= 0 && comparison(list[i], key) > 0; i--)
                {
                    list[i + 1] = list[i];
                }
                list[i + 1] = key;
            }
    }
    static void Main(string[] args)
    {
        List<Widget> widgets = new List<Widget>();

        widgets.Add(new Widget(0, 1));
        widgets.Add(new Widget(1, 1));
        widgets.Add(new Widget(0, 2));
        widgets.Add(new Widget(1, 2));

        InsertionSort<Widget>(widgets, Widget.Compare);

        foreach (Widget w in widgets)
        {
            Console.WriteLine(w.X + ":" + w.Y);
        }
    }
0:1
0:2
1:1
1:2
Press any key to continue . . .
    var data = (from o in database.Orders Where o.ClientId.Equals(clientId) select new {
    OrderId = o.id,
    OrderDate = o.orderDate,
    OrderBoolean = (SomeClass.SomeFunction(o.orderBoolean) ? 1 : 0)
    });

    data.Sort((o1, o2) => (o2.OrderBoolean.CompareTo(o1.OrderBoolean) != 0
    o2.OrderBoolean.CompareTo(o1.OrderBoolean) : o1.OrderDate.Value.CompareTo(o2.OrderDate.Value)));