Merge pull request #5405 from RoosterDragon/min-max
Added MinBy, MaxBy, etc.
This commit is contained in:
@@ -131,6 +131,54 @@ namespace OpenRA
|
||||
for (;;) { yield return t; t = f(t); }
|
||||
}
|
||||
|
||||
public static T MinBy<T, U>(this IEnumerable<T> ts, Func<T, U> selector)
|
||||
{
|
||||
return ts.CompareBy(selector, 1, true);
|
||||
}
|
||||
|
||||
public static T MaxBy<T, U>(this IEnumerable<T> ts, Func<T, U> selector)
|
||||
{
|
||||
return ts.CompareBy(selector, -1, true);
|
||||
}
|
||||
|
||||
public static T MinByOrDefault<T, U>(this IEnumerable<T> ts, Func<T, U> selector)
|
||||
{
|
||||
return ts.CompareBy(selector, 1, false);
|
||||
}
|
||||
|
||||
public static T MaxByOrDefault<T, U>(this IEnumerable<T> ts, Func<T, U> selector)
|
||||
{
|
||||
return ts.CompareBy(selector, -1, false);
|
||||
}
|
||||
|
||||
static T CompareBy<T, U>(this IEnumerable<T> ts, Func<T, U> selector, int modifier, bool throws)
|
||||
{
|
||||
var comparer = Comparer<U>.Default;
|
||||
T t;
|
||||
U u;
|
||||
using (var e = ts.GetEnumerator())
|
||||
{
|
||||
if (!e.MoveNext())
|
||||
if (throws)
|
||||
throw new ArgumentException("Collection must not be empty.", "ts");
|
||||
else
|
||||
return default(T);
|
||||
t = e.Current;
|
||||
u = selector(t);
|
||||
while (e.MoveNext())
|
||||
{
|
||||
T nextT = e.Current;
|
||||
U nextU = selector(nextT);
|
||||
if (comparer.Compare(nextU, u) * modifier < 0)
|
||||
{
|
||||
t = nextT;
|
||||
u = nextU;
|
||||
}
|
||||
}
|
||||
return t;
|
||||
}
|
||||
}
|
||||
|
||||
public static int NextPowerOf2(int v)
|
||||
{
|
||||
--v;
|
||||
|
||||
@@ -156,8 +156,7 @@ namespace OpenRA.FileSystem
|
||||
var index = type == PackageHashType.CRC32 ? crcHashIndex : classicHashIndex;
|
||||
var folder = index[PackageEntry.HashFilename(filename, type)]
|
||||
.Where(x => x.Exists(filename))
|
||||
.OrderBy(x => x.Priority)
|
||||
.FirstOrDefault();
|
||||
.MinByOrDefault(x => x.Priority);
|
||||
|
||||
if (folder != null)
|
||||
return folder.GetContent(filename);
|
||||
@@ -196,8 +195,7 @@ namespace OpenRA.FileSystem
|
||||
{
|
||||
var folder = MountedFolders
|
||||
.Where(x => x.Exists(filename + ext))
|
||||
.OrderByDescending(x => x.Priority)
|
||||
.FirstOrDefault();
|
||||
.MaxByOrDefault(x => x.Priority);
|
||||
|
||||
if (folder != null)
|
||||
{
|
||||
|
||||
@@ -21,8 +21,7 @@ namespace OpenRA.Orders
|
||||
{
|
||||
var underCursor = world.ScreenMap.ActorsAt(mi)
|
||||
.Where(a => !world.FogObscures(a) && a.HasTrait<ITargetable>())
|
||||
.OrderByDescending(a => a.Info.SelectionPriority())
|
||||
.FirstOrDefault();
|
||||
.WithHighestSelectionPriority();
|
||||
|
||||
Target target;
|
||||
if (underCursor != null)
|
||||
@@ -31,8 +30,7 @@ namespace OpenRA.Orders
|
||||
{
|
||||
var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, mi)
|
||||
.Where(a => a.Info.Traits.Contains<ITargetableInfo>())
|
||||
.OrderByDescending(a => a.Info.SelectionPriority())
|
||||
.FirstOrDefault();
|
||||
.WithHighestSelectionPriority();
|
||||
target = frozen != null ? Target.FromFrozenActor(frozen) : Target.FromCell(xy);
|
||||
}
|
||||
|
||||
@@ -61,8 +59,7 @@ namespace OpenRA.Orders
|
||||
var useSelect = false;
|
||||
var underCursor = world.ScreenMap.ActorsAt(mi)
|
||||
.Where(a => !world.FogObscures(a) && a.HasTrait<ITargetable>())
|
||||
.OrderByDescending(a => a.Info.SelectionPriority())
|
||||
.FirstOrDefault();
|
||||
.WithHighestSelectionPriority();
|
||||
|
||||
if (underCursor != null && (mi.Modifiers.HasModifier(Modifiers.Shift) || !world.Selection.Actors.Any()))
|
||||
{
|
||||
@@ -78,8 +75,7 @@ namespace OpenRA.Orders
|
||||
{
|
||||
var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, mi)
|
||||
.Where(a => a.Info.Traits.Contains<ITargetableInfo>())
|
||||
.OrderByDescending(a => a.Info.SelectionPriority())
|
||||
.FirstOrDefault();
|
||||
.WithHighestSelectionPriority();
|
||||
target = frozen != null ? Target.FromFrozenActor(frozen) : Target.FromCell(xy);
|
||||
}
|
||||
|
||||
@@ -161,5 +157,15 @@ namespace OpenRA.Orders
|
||||
var selectableInfo = a.Traits.GetOrDefault<SelectableInfo>();
|
||||
return selectableInfo != null ? selectableInfo.Priority : int.MinValue;
|
||||
}
|
||||
|
||||
public static Actor WithHighestSelectionPriority(this IEnumerable<Actor> actors)
|
||||
{
|
||||
return actors.MaxByOrDefault(a => a.Info.SelectionPriority());
|
||||
}
|
||||
|
||||
public static FrozenActor WithHighestSelectionPriority(this IEnumerable<FrozenActor> actors)
|
||||
{
|
||||
return actors.MaxByOrDefault(a => a.Info.SelectionPriority());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -535,7 +535,7 @@ namespace OpenRA.Server
|
||||
LobbyInfo.Clients.RemoveAll(c => c.Bot != null && c.BotControllerClientIndex == toDrop.PlayerIndex);
|
||||
|
||||
var nextAdmin = LobbyInfo.Clients.Where(c1 => c1.Bot == null)
|
||||
.OrderBy(c => c.Index).FirstOrDefault();
|
||||
.MinByOrDefault(c => c.Index);
|
||||
|
||||
if (nextAdmin != null)
|
||||
{
|
||||
|
||||
@@ -106,8 +106,7 @@ namespace OpenRA.Widgets
|
||||
|
||||
var underCursor = world.ScreenMap.ActorsAt(worldRenderer.Viewport.ViewToWorldPx(Viewport.LastMousePos))
|
||||
.Where(a => !world.FogObscures(a) && a.HasTrait<IToolTip>())
|
||||
.OrderByDescending(a => a.Info.SelectionPriority())
|
||||
.FirstOrDefault();
|
||||
.WithHighestSelectionPriority();
|
||||
|
||||
if (underCursor != null)
|
||||
{
|
||||
@@ -118,8 +117,7 @@ namespace OpenRA.Widgets
|
||||
|
||||
var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, worldRenderer.Viewport.ViewToWorldPx(Viewport.LastMousePos))
|
||||
.Where(a => a.TooltipName != null)
|
||||
.OrderByDescending(a => a.Info.SelectionPriority())
|
||||
.FirstOrDefault();
|
||||
.WithHighestSelectionPriority();
|
||||
|
||||
if (frozen != null)
|
||||
{
|
||||
|
||||
@@ -93,8 +93,7 @@ namespace OpenRA.Widgets
|
||||
if (multiClick)
|
||||
{
|
||||
var unit = World.ScreenMap.ActorsAt(xy)
|
||||
.OrderByDescending(a => a.Info.SelectionPriority())
|
||||
.FirstOrDefault();
|
||||
.WithHighestSelectionPriority();
|
||||
|
||||
var newSelection2 = SelectActorsInBox(World, worldRenderer.Viewport.TopLeft, worldRenderer.Viewport.BottomRight,
|
||||
a => unit != null && a.Info.Name == unit.Info.Name && a.Owner == unit.Owner);
|
||||
|
||||
@@ -35,13 +35,12 @@ namespace OpenRA
|
||||
|
||||
public static Actor ClosestTo(this IEnumerable<Actor> actors, Actor a)
|
||||
{
|
||||
var pos = a.CenterPosition;
|
||||
return actors.OrderBy(b => (b.CenterPosition - pos).LengthSquared).FirstOrDefault();
|
||||
return actors.ClosestTo(a.CenterPosition);
|
||||
}
|
||||
|
||||
public static Actor ClosestTo(this IEnumerable<Actor> actors, WPos pos)
|
||||
{
|
||||
return actors.OrderBy(a => (a.CenterPosition - pos).LengthSquared).FirstOrDefault();
|
||||
return actors.MinByOrDefault(a => (a.CenterPosition - pos).LengthSquared);
|
||||
}
|
||||
|
||||
public static IEnumerable<Actor> FindActorsInCircle(this World world, WPos origin, WRange r)
|
||||
|
||||
Reference in New Issue
Block a user