C# 按若干条件进行排序或搜索

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

我有一个带有属性的类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; }
我正在创建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.NumRobotsNearStationmaxNumStationsAround?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 ;
}