我有一個代表植物的對象列表 - 每個對象都有代表一系列可容忍環境條件的成員屬性。按照多個條件對列表<>中的對象進行排序
我想重新排列這個列表,使得工廠對象按照適合性順序排列。
我想我給列表中的每個項目提供溫度/ pH適應性的排名,基於它們溫度/ pH範圍的中間值與所提供的環境數據的接近程度。
然後,我會平均排名和排序列表中的這個數字。
但是,我不確定最好的方法是跟蹤給列表中每個項目的等級。有人對如何最好地解決這個問題有任何建議嗎?
我有一個代表植物的對象列表 - 每個對象都有代表一系列可容忍環境條件的成員屬性。按照多個條件對列表<>中的對象進行排序
我想重新排列這個列表,使得工廠對象按照適合性順序排列。
我想我給列表中的每個項目提供溫度/ pH適應性的排名,基於它們溫度/ pH範圍的中間值與所提供的環境數據的接近程度。
然後,我會平均排名和排序列表中的這個數字。
但是,我不確定最好的方法是跟蹤給列表中每個項目的等級。有人對如何最好地解決這個問題有任何建議嗎?
你可以做這樣的:
var plants = new Plant[] { new Plant { T = 1, Ph = 2 }, new Plant { T = 2, Ph = 2 } };
var ps = from p in plants
let magicNumber = p.T/p.Ph // Or some other algorithm
orderby magicNumber
select p;
然後,你可以創造任何你從Plant
的屬性,如數量,你沒有實現比較器。
難道你不能簡單地調用Sort方法,傳入一個比較方法,它的計算方法與剛描述的方式完全相同?
您可以使用LINQ OrderBy擴展方法。現在,通常你可以把它寫像這樣:
mySet.OrderBy(x => x.SomeProperty)
但是,如果你想通過多個屬性排序,你可以簡單地創建一個方法來定義的值:
mySet.OrderBy(x => CreateValueFor(x))
然後CreateValueFor
回報回到特定的價值。例如,創建一個定義它的適合性的整數,這實際上是對象上某些屬性的函數。
公開方法在你的類計算的適宜性,然後使用LINQ OrderBy
擴展
public int GetSuitabilityIndex()
{
//Calculate suitability..
}
var sorted = myList.OrderBy(item=>item.GetSuitabilityIndex());
你的情況,這聽起來像你最好了與自定義比較,你可以通過你的環境設置:
class PlantComparer : IComparer<Plant>
{
public PlantComparer(PlantEnvironmentSettings settings)
{
}
public int Compare(Plant plant1, Plant plant2)
{
//compare two plants, return 0, 1 or -1
return 0;
}
}
然後你就可以在一種使用它:
List<Plant> plants = new List<Plant>();
..
PlantEnvironmentSettings settings = new PlantEnvironmentSettings();
plants.Sort(new PlantComparer(settings));
您需要一種方法來計算排名的一個項目,我們稱之爲GetRank
,那麼你可以使用在Sort
方法與Comparison
:
plants.Sort((x,y) => GetRank(x).CompareTo(GetRank(y)));
您還可以使用OrderBy
擴展方法,採取委託其爲每個項目返回值:
plants = plants.OrderBy(x => GetRank(x)).ToList();
計算秩不必是命名方法的方法,你可以直接把代碼放在Comparison
或OrderBy
代表只需用GetRank(n)
替換您喜歡的任何表達式即可。
假設你想要顯示的各種適應性的標準,而不是僅僅一個有序的植物名單,我認爲你需要定義一個類,具有額外數據:
class PlantRankings
{
public Plant Plant { get; set; }
public double PhSuitabilityScore { get; set; }
public double SoilTypeScore { get; set; }
public double SmellsNiceScore { get; set; }
public double RankingScore { get; set; } // could compute on-the-fly here
}
和映射你的植物成類然後按那裏的綜合分數排序。我想你會寫一個接受Plant的方法,然後你的標準返回一個排名結構,例如,
var rankedPlants = plants.Select(p => ScoreSuitability(p, criteria))
.OrderBy(pr => pr.RankingScore).ToList();
如果排名,那麼你然後再意味着1-N的排名每家工廠由每個標準我認爲你需要生成擴展結構,但從
public int PhSuitabilityRank { get; set; }
分數一起;你可以
int rank = 1;
for(var rankedPlant in
rankedPlants.OrderByDescending(pr => pr.PhSuitabilityScore))
{
rankedPlant.PhSuitabilityRank = rank;
++rank;
}
等等然後一旦你計算出的分數和建立的列表。 (可能有一種方法可以在LINQ中完成,但在命令結果中沒有.ForEach(),我認爲這更清晰和更簡單。)
您可以使用linq或lembda表達式排序您的星球列表 它會讓你排序的列表。