C#对列表中满足条件的项目进行排序,并将其与列表一起排序

C#对列表中满足条件的项目进行排序,并将其与列表一起排序,c#,linq,list,sorting,C#,Linq,List,Sorting,本质上,我有一个C#中的列表,其中充满了类似这样的结构(代码可能不适合语法) 我想做的是对列表进行排序,以便: 按距离排序列表(已完成此操作,没有问题) 对于距离小于SomeCriteria的每个数字,按X和Y的总和对这些列表项进行排序,同时不创建新列表。只需重新排列列表 结果是: Distance 12, x 0, y 0; Distance 4, x 20, y 20; Distance 6, x 0, y 3; 在第一步之后: Distance 4, x 20, y 20; Distan

本质上,我有一个C#中的列表,其中充满了类似这样的结构(代码可能不适合语法)

我想做的是对列表进行排序,以便:

  • 按距离排序列表(已完成此操作,没有问题)
  • 对于距离小于SomeCriteria的每个数字,按X和Y的总和对这些列表项进行排序,同时不创建新列表。只需重新排列列表
  • 结果是:

    Distance 12, x 0, y 0;
    Distance 4, x 20, y 20;
    Distance 6, x 0, y 3;
    
    在第一步之后:

    Distance 4, x 20, y 20;
    Distance 6, x 0, y 3;
    Distance 12, x 0, y 0;
    
    步骤2之后(如果距离小于10,则按X和Y的总和对所有对象进行排序)


    这里需要更复杂的比较方法

    var numbers = new List<Numbers>{ new Numbers(6,0,3),   new Numbers(12,0,0), 
                                     new Numbers(4,20,20), new Numbers(5,20,20)};       
    int d = 10;
    
    numbers.Sort((a,b)=>
                 {
                     if (a.DistanceFromArbitraryPoint >= d && b.DistanceFromArbitraryPoint >= d)                         
                         return a.DistanceFromArbitraryPoint.CompareTo(b.DistanceFromArbitraryPoint);                        
                     if (a.DistanceFromArbitraryPoint >= d)
                         return 1;
                     if (b.DistanceFromArbitraryPoint >= d)
                         return -1;
    
                     int c = (a.X+a.Y).CompareTo(b.X+b.Y);                       
                     if (c == 0)
                         c = a.DistanceFromArbitraryPoint.CompareTo(b.DistanceFromArbitraryPoint);
                     return c;                       
                 });
    
    使用
    列表中的
    排序(比较)
    ,而不是Linq


    您不过滤这三个项目,但这听起来好像您希望这样做:“对于距离list=query.ToList()
    ?您能分享到目前为止的尝试吗?让我们不要重复您的努力,因为您需要展示一些研究和失败的尝试。可能是@SimonShine的重复,无法与orderby一起使用。因为有一个条件。不满足条件的项目应保持不变。
    Distance 6, x 0, y 3; // lower X and Y Sum, goes first
    Distance 4, x 20, y 20;
    Distance 12, x 0, y 0; // Distance higher than 10, remains unsorted
    
    var numbers = new List<Numbers>{ new Numbers(6,0,3),   new Numbers(12,0,0), 
                                     new Numbers(4,20,20), new Numbers(5,20,20)};       
    int d = 10;
    
    numbers.Sort((a,b)=>
                 {
                     if (a.DistanceFromArbitraryPoint >= d && b.DistanceFromArbitraryPoint >= d)                         
                         return a.DistanceFromArbitraryPoint.CompareTo(b.DistanceFromArbitraryPoint);                        
                     if (a.DistanceFromArbitraryPoint >= d)
                         return 1;
                     if (b.DistanceFromArbitraryPoint >= d)
                         return -1;
    
                     int c = (a.X+a.Y).CompareTo(b.X+b.Y);                       
                     if (c == 0)
                         c = a.DistanceFromArbitraryPoint.CompareTo(b.DistanceFromArbitraryPoint);
                     return c;                       
                 });
    
    6 (0,3); 4 (20,20); 5 (20,20); 12 (0,0)
    
    public struct Numbers
    {
        public Numbers(int d, int x, int y)
        {
            DistanceFromArbitraryPoint  = d;
            X = x;
            Y = y;
        }
        public int DistanceFromArbitraryPoint;
    
        public int X;
        public int Y;
    
        public override string ToString()
        {
            return String.Format("{0} ({1},{2})", DistanceFromArbitraryPoint, X,Y);
        }
    }