我有一个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))
但它并没有完全符合我的要求。
干杯!
答案 0 :(得分:4)
当x.Position
和y.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。