用于自定义排序列表的Lambda表达式

时间:2015-09-15 04:18:50

标签: c# list sorting lambda

我有一个MyClass列表,其中一个属性是位置。最初,这些职位可能是这样的:

2,-3,1,3,4,5,-2,-1,

使用Sort(NOT .OrderBy)方法,我需要一个 lambda表达式 ,这将导致上述数字从最低正数排序,然后从最低负数排序数字,所以输出将是:

1,2,3,4,5,-1,-2,-3

我是lambda表达式的新手,我做到了这一点:myList.Sort((x, y) => x.Position.CompareTo(y.Position))但它并没有完全符合我的要求。

干杯!

5 个答案:

答案 0 :(得分:4)

x.Positiony.Position均为正值或均为负值时,您可以按其绝对值对其进行排序。 否则,请使用CompareTo函数

的反转值
myList.Sort((x,y) => x.Position > 0 && y.Position > 0 || x.Position < 0 && y.Position < 0 ? 
                      Math.Abs(x.Position).CompareTo(Math.Abs(y.Position)) :
                      -x.Position.CompareTo(y.Position));

答案 1 :(得分:2)

您需要为IComparable实施自己的自定义MyClass并实施CompareTo。可以找到更多信息here。这是一个不使用IComparable的直接样本。

using System;
using System.Linq;
using System.Collections.Generic;
public class Test
{
    public static void Main()
    {
        var myList = new List<int>() { 2,-3,1,3,4,5,-2,-1,};
        myList.Sort(Compare);
        foreach(var item in myList){
            Console.WriteLine(item);
        }
    }

    static int Compare(int x, int y)
    {
     if (x > 0 && y < 0)
     {
        return -1;
     }

     if (x < 0 && y > 0)
     {
        return 1;
     }

     if (x < 0 && y < 0)
     {
        return y.CompareTo(x);
     }
     return x.CompareTo(y);
    }
}
  

对于对象A,B和C,必须满足以下条件:   A.CompareTo(A)必须返回零。   如果A.CompareTo(B)返回零,则B.CompareTo(A)必须返回零。   如果A.CompareTo(B)返回零并且B.CompareTo(C)返回零,则A.CompareTo(C)必须返回零。   如果A.CompareTo(B)返回非零值,则B.CompareTo(A)必须返回相反符号的值。   如果A.CompareTo(B)返回值x不等于零,并且B.CompareTo(C)返回与x相同符号的值y,则A.CompareTo(C)必须返回与此符号相同的值。 x和y。   来电者须知   使用CompareTo方法确定类实例的顺序。

答案 2 :(得分:1)

@transaction.commit_on_success

答案 3 :(得分:0)

 class ListOperations
{
    public static void Main(string[] args)
    {
        List<Book> books = new List<Book>
       {
           new Book { Name="book1",ISBN= 554654,Category= "Mathematics",Price=12.45,Index=1},
           new Book { Name="book2",ISBN= 454654, Category="English", Price=-6.45, Index=3},
           new Book {Name="book3",ISBN= 754654, Category="English", Price=7.45, Index=4 },
           new Book { Name = "book4", ISBN = 854654,Category= "History", Price=8.45,Index= 5 },
           new Book { Name = "book5", ISBN = 154654, Category="Mathematics", Price=17.45, Index=2 },
           new Book { Name = "book6", ISBN = 354654, Category="History", Price=-15.45, Index=6 },
           new Book { Name = "book7", ISBN = 354653, Category="History", Price=0, Index=6 }
        };
        books.Sort((x, y) =>( x.Price > 0 && y.Price > 0 || x.Price < 0 && y.Price < 0 )? Math.Abs(x.Price).CompareTo(Math.Abs(y.Price)) : -x.Price.CompareTo(y.Price));
    }

    class Book
    {
        public string Name { get; set; }
        public int ISBN { get; set; }
        public string Category { get; set; }
        public double Price { get; set; }
        public double Index { get; set; }
        public int RowNum { get; set; }
    }
}

答案 4 :(得分:-2)

此代码适用于您的情况。

var values = new[] {2,-3,1,3,4,5,-2,-1};
var solution = values.GroupBy(i => i > 0)
    .SelectMany(g => g.Key? g.OrderBy(c=>c) : g.OrderByDescending(c=>c))
    .ToArray();

此处附有工作sample