public class Witness
{
public Mobile m_mobile;
public bool m_hasLOS;
public double m_distanceToSqrt;
public Witness(Mobile m, bool hasLOS, double distanceToSqrt)
{
m_mobile = m;
m_hasLOS = hasLOS;
m_distanceToSqrt = distanceToSqrt;
}
}
我已經創建了這些物件“見證”的串列,現在想在 m_hasLOS 和 m_distanceToSqrt 上對其進行排序。
在我的代碼中,我呼叫:
List<Witness> sorted = witnesses.OrderBy(x => x.m_hasLOS).ThenBy(x => x.m_distanceToSqrt).ToList();
這行得通,但串列沒有按我的意愿排序。如何更改排序方式:LOS 始終位于串列頂部,按升序排列?如果 LOS 為假,那么串列只是上升距離?
例如:
o1: m_LOS = true, m_distanceToSqrt = 13
o2: m_LOS = false, m_distanceToSqrt = 6
o3: m_LOS = false, m_distanceToSqrt = 2
應該產生 reaultant 排序:
o1: m_LOS = true, m_distanceToSqrt = 13
o3: m_LOS = false, m_distanceToSqrt = 2
o2: m_LOS = false, m_distanceToSqrt = 6
uj5u.com熱心網友回復:
在 C 語言家族(以及許多其他語言)中,您可以將其false視為等于0和true等于1(更具體地說,任何不是的0)。
因此,當排序順序為升序時,對boolean欄位進行排序將false首先回傳所有值,因為0 < 1. 如果您true首先需要這些值,則需要使用降序排序。
對于OrderBy,即OrderByDescending。對于ThenBy,即ThenByDescending。在您的情況下,您只需要使用第一個。
List<Witness> sorted = witnesses
.OrderByDescending(x => x.m_hasLOS)
.ThenBy(x => x.m_distanceToSqrt)
.ToList();
在 .NET Fiddle 上嘗試一下。
旁注,公共成員應該使用帕斯卡大小寫,屬性應該優先于公共欄位,以便從類職責中抽象實作細節,變數名應該有利于可讀性而不是長度。
撰寫類定義的常規方法是:
public class Witness
{
private Mobile mobile;
private bool hasLineOfSight;
private double distanceToSquareRoot;
public Mobile Mobile
{
get => mobile;
set => mobile = value;
}
public bool HasLineOfSight
{
get => hasLineOfSight;
set => hasLineOfSight = value;
}
public double DistanceToSquareRoot
{
get => distanceToSquareRoot;
set => distanceToSquareRoot = value;
}
public Witness(Mobile mobile, bool hasLineOfSight, double distanceToSquareRoot)
{
Mobile = mobile;
HasLineOfSight = hasLineOfSight;
DistanceToSquareRoot = distanceToSquareRoot;
}
}
由于您的類沒有任何方法,因此如果它的主要用途是作為值型別,則可以改用該record型別。
public record Witness(
Mobile Mobile,
bool HasLineOfSight,
double DistanceToSquareRoot
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/405591.html
標籤:
