-3

プロパティを持つクラス 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# ターンキー ソリューションはありますか?

4

4 に答える 4

0

どうですか:

var filtered = myArray.Where(a => a.EnergyConsumption == min 
   && a.CurrentEnergyAmount == max
   && a.NumRobotNearStation == max
   && a.NumStationsAround == min)
于 2013-09-20T16:26:12.193 に答える
0

条件に応じて独自の Comparer to Sort を作成できます。

stations.Sort( new StationsComparer() );

ここで、StationsComparer は次のとおりです。

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;
    }
}
于 2013-09-20T17:15:44.217 に答える
0

この 2 パス ソリューションは、おおよそ得られるものだと思います。

  • 興味深い属性ごとに最小値を見つけるための 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 ;
    }
    
于 2013-09-20T17:15:56.350 に答える
0

ステーションがこれらすべての基準を同時に満たすことはまずありません。基準の少なくとも 1 つを満たすすべてのステーションを返す方がおそらく理にかなっています。

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);
于 2013-09-20T16:38:06.917 に答える