C# 按若干条件进行排序或搜索
我有一个带有属性的类StationInfo:C# 按若干条件进行排序或搜索,c#,C#,我有一个带有属性的类StationInfo: public uint EnergyConsumption { get; private set; } public uint CurrentEnergyAmount { get; private set; } public uint NumRobotsNearStation { get; private set; } public uint NumStationsAround { get; private set; } 我正在创建StationI
public uint EnergyConsumption { get; private set; }
public uint CurrentEnergyAmount { get; private set; }
public uint NumRobotsNearStation { get; private set; }
public uint NumStationsAround { get; private set; }
我正在创建StationInfo类型的数组
在此数组中,我需要找到同时满足以下条件的对象:
EnergyConsumption -> min
CurrentEnergyAmount -> max
NumRobotsNearStation -> min
NumStationsAround -> max
带有2个参数的示例:
{2,1}
{3,4}
{6,7}
{1,10}
{2, 15}
需要查找{min,max}
没有具有此条件的对象,但存在值接近最小值和最大值的对象{2,15}
有C#交钥匙解决方案来解决这个问题吗?怎么样:
var filtered = myArray.Where(a => a.EnergyConsumption == min
&& a.CurrentEnergyAmount == max
&& a.NumRobotNearStation == max
&& a.NumStationsAround == min)
一个核电站不可能同时满足所有这些标准。返回至少满足其中一个条件的所有电台可能更有意义
uint minEnergyConsumption = stations.Min(s => s.EnergyConsumption);
uint maxCurrentEnergyAmount = stations.Max(s => s.CurrentEnergyAmount);
uint maxNumRobotsNearStation = stations.Max(s => s.NumRobotsNearStation);
uint minNumStationsAround = stations.Min(s => s.NumStationsAround);
var result = stations
.Where(s => s.EnergyConsumption == minEnergyConsumption ||
s.CurrentEnergyAmount == maxCurrentEnergyAmount ||
s.NumRobotNearStation == maxNumRobotsNearStation ||
s.NumStationsAround == minNumStationsAround);
您可以创建自己的比较器,以便根据您的条件进行排序:
stations.Sort( new StationsComparer() );
其中StationComparer是:
class StationsComparer: IComparer<StationInfo>
{
public int Compare( StationInfo x, StationInfo y )
{
int result = x.EnergyConsumption.CompareTo( y.EnergyConsumption );
if( result == 0 )
result = y.CurrentEnergyAmount.CompareTo( x.CurrentEnergyAmount );
if( result == 0 )
result = y.NumRobotNearStation.CompareTo( x.NumRobotNearStation );
if( result == 0 )
result = x.NumStationsAround.CompareTo( y.NumStationsAround );
return result;
}
}
class StationComparer:IComparer
{
公共整数比较(StationInfo x、StationInfo y)
{
int结果=x.能量消耗。与(y.能量消耗)相比;
如果(结果==0)
结果=y.CurrentEnergyAmount.CompareTo(x.CurrentEnergyAmount);
如果(结果==0)
结果=y.NumRobotNearStation.CompareTo(x.NumRobotNearStation);
如果(结果==0)
结果=x.NumStationsAround.CompareTo(y.NumStationsAround);
返回结果;
}
}
我认为这个2通解决方案是一个很好的解决方案
- 通过1次查找每个有趣属性的最小值
- 1个查找匹配项的过程(如果有)
StationInfo FindMin(IEnumerable站) { uint minEnergyConsumption=uint.MaxValue; uint MaxCurrentEnergyMount=uint.MinValue; uint minNumRobotsNearStation=uint.MaxValue; uint maxNumStationsAround=uint.MinValue; //找到每个感兴趣字段的最小值 foreach(StationInfo si in stations) { 矿产能源消耗=si.能源消耗<矿产能源消耗?si.能源消耗:矿产能源消耗; MaxCurrentEnergyMount=si.CurrentEnergyMount>MaxCurrentEnergyMount?si.CurrentEnergyMount:MaxCurrentEnergyMount; minNumRobotsNearStation=si.NumRobotsNearStation
maxNumStationsAround?si.NumStationsAround:maxNumStationsAround; } StationInfo实例=stations.FirstOrDefault(x=> x、 能耗==矿井能耗 &&x.CurrentEnergyMount==MaxCurrentEnergyMount &&x.NumRobotsNearStation==minNumRobotsNearStation &&x.NumStationsAround==最大NumStationsAround ); 返回实例; }
list.Where(x=>x.EnergyConsumption==min&……)代码>不能最小化/最大化多个不同的变量。是否要查找四个对象;这四个字段中每个字段的最小值/最大值是多少?。。。最小值和最大值是已知值还是必须找到?如果没有一个元素满足您的条件(一个属性满足,但其他属性不满足),会发生什么?如果最大值和最小值存储在不同的StationInfo
对象中,应该返回什么?“那么他们中就没有人会符合条件了。”埃拉德曼好的,离得够近了吗?是否在方法指定的值/百分比范围内使用1,使用1%?您是否希望最小化每个项目的价值与其最佳价值之间的差异之和?您需要更具体地说明这应该做什么。解释一个人将如何确定正确答案,我们可能会帮助您将其转化为计算机可以理解的东西。
StationInfo FindMin( IEnumerable<StationInfo> stations )
{
uint minEnergyConsumption = uint.MaxValue ;
uint maxCurrentEnergyAmount = uint.MinValue ;
uint minNumRobotsNearStation = uint.MaxValue ;
uint maxNumStationsAround = uint.MinValue ;
// find the min value for each interesting field
foreach ( StationInfo si in stations )
{
minEnergyConsumption = si.EnergyConsumption < minEnergyConsumption ? si.EnergyConsumption : minEnergyConsumption ;
maxCurrentEnergyAmount = si.CurrentEnergyAmount > maxCurrentEnergyAmount ? si.CurrentEnergyAmount : maxCurrentEnergyAmount ;
minNumRobotsNearStation = si.NumRobotsNearStation < minNumRobotsNearStation ? si.NumRobotsNearStation : minNumRobotsNearStation ;
maxNumStationsAround = si.NumStationsAround > maxNumStationsAround ? si.NumStationsAround : maxNumStationsAround ;
}
StationInfo instance = stations.FirstOrDefault( x =>
x.EnergyConsumption == minEnergyConsumption
&& x.CurrentEnergyAmount == maxCurrentEnergyAmount
&& x.NumRobotsNearStation == minNumRobotsNearStation
&& x.NumStationsAround == maxNumStationsAround
);
return instance ;
}