我有一个代表植物的对象列表 - 每个对象都有代表一系列可容忍环境条件的成员属性。按照多个条件对列表<>中的对象进行排序
我想重新排列这个列表,使得工厂对象按照适合性顺序排列。
我想我给列表中的每个项目提供温度/ 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表达式排序您的星球列表 它会让你排序的列表。