gpt4 book ai didi

c# - 如果有多个属性,如何对列表类型通用进行排序?

转载 作者:太空狗 更新时间:2023-10-29 20:46:26 24 4
gpt4 key购买 nike

我有一个具有属性(类类型)的泛型列表。我需要 Z 参数(TrainingSet)的排序方法:

public override List<TrainingSet> CalculatedDistancesArray
(List<TrainigSet> ts, double x, double y, int k)
{
for (int i =0; i < ts.Count; i++)
{
ts[i].Z = (Math.Sqrt(Math.Pow((ts[i].X - x), 2)
+ Math.Pow((ts[i].Y - y), 2)));
}
// I want to sort according to Z
ts.Sort(); //Failed to compare two elements in the array.
List<TrainingSet> sortedlist = new List<TrainingSet>();
for (int i = 0; i < k; i++)
{
sortedlist.Add(ts[i]);
}
return ts;
}

public class TrainigSet
{
public double X { get; set; }
public double Y { get; set; }
public double Z { get; set; }
public string Risk { get; set; }
}

最佳答案

只需对单个属性进行排序很容易。使用带 Comparison<T> 的重载:

// C# 2
ts.Sort(delegate (TrainingSet o1, TrainingSet o2)
{ return o1.Z.CompareTo(o2.Z)); }
);

// C# 3
ts.Sort((o1, o2) => o1.Z.CompareTo(o2.Z));

对多个属性进行排序有点棘手。我有类以复合方式建立比较,以及建立“投影比较”,但如果你真的只想按 Z 排序,那么上面的代码将尽可能简单。

如果您使用的是 .NET 3.5,并且您真的不需要就地排序列表,您可以使用 OrderBy 和 ThenBy,例如

return ts.OrderBy(t => t.Z);

或者更复杂的比较:

return ts.OrderBy(t => t.Z).ThenBy(t => t.X);

这些将由 orderby 表示查询表达式中的子句:

return from t in ts
orderby t.Z
select t;

return from t in ts
orderby t.Z, t.X
select t;

(如果你愿意,你也可以按降序排列。)

关于c# - 如果有多个属性,如何对列表类型通用进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/842998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com