C#对列表中满足条件的项目进行排序,并将其与列表一起排序
本质上,我有一个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
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);
}
}