Introduce FirstOrDefault extensions method for Array.Find and List.Find.
This allows the LINQ spelling to be used, but benefits from the performance improvement of the specific methods for these classes that provide the same result.
This commit is contained in:
@@ -247,8 +247,7 @@ namespace OpenRA.Mods.Common.Widgets
|
||||
|
||||
var position = GetTextPosition(text, font, rb);
|
||||
|
||||
// PERF: Avoid LINQ by using Children.Find(...) != null instead of Children.Any(...)
|
||||
var hover = Ui.MouseOverWidget == this || Children.Find(c => c == Ui.MouseOverWidget) != null;
|
||||
var hover = Ui.MouseOverWidget == this || Children.FirstOrDefault(c => c == Ui.MouseOverWidget) != null;
|
||||
DrawBackground(rb, disabled, Depressed, hover, highlighted);
|
||||
if (Contrast)
|
||||
font.DrawTextWithContrast(text, position + stateOffset,
|
||||
|
||||
@@ -146,8 +146,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
|
||||
if (map.Package != null)
|
||||
{
|
||||
selectedDirectory = writableDirectories.Find(k => k.Folder.Contains(map.Package.Name));
|
||||
selectedDirectory ??= writableDirectories.Find(k => Directory.GetDirectories(k.Folder.Name).Any(f => f.Contains(map.Package.Name)));
|
||||
selectedDirectory = writableDirectories.FirstOrDefault(k => k.Folder.Contains(map.Package.Name));
|
||||
selectedDirectory ??= writableDirectories.FirstOrDefault(k => Directory.GetDirectories(k.Folder.Name).Any(f => f.Contains(map.Package.Name)));
|
||||
}
|
||||
|
||||
// Prioritize MapClassification.User directories over system directories
|
||||
|
||||
@@ -33,7 +33,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
|
||||
void SelectTab(bool reverse)
|
||||
{
|
||||
palette.CurrentQueue = Array.Find(queues, q => q.Enabled);
|
||||
palette.CurrentQueue = queues.FirstOrDefault(q => q.Enabled);
|
||||
|
||||
// When a tab is selected, scroll to the top because the current row position may be invalid for the new tab
|
||||
palette.ScrollToTop();
|
||||
|
||||
@@ -212,7 +212,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
}
|
||||
|
||||
var localClient = orderManager.LocalClient;
|
||||
var localPlayer = localClient == null ? null : Array.Find(world.Players, player => player.ClientIndex == localClient.Index);
|
||||
var localPlayer = localClient == null ? null : world.Players.FirstOrDefault(player => player.ClientIndex == localClient.Index);
|
||||
bool LocalPlayerCanKick() => localClient != null
|
||||
&& (Game.IsHost || ((!orderManager.LocalClient.IsObserver) && localPlayer.WinState == WinState.Undefined));
|
||||
bool CanClientBeKicked(Session.Client client, Func<bool> isVoteKick) =>
|
||||
|
||||
@@ -80,7 +80,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
var downloadYaml = MiniYaml.Load(modFileSystem, content.Downloads, null);
|
||||
modFileSystem.UnmountAll();
|
||||
|
||||
var download = downloadYaml.Find(n => n.Key == content.QuickDownload);
|
||||
var download = downloadYaml.FirstOrDefault(n => n.Key == content.QuickDownload);
|
||||
if (download == null)
|
||||
throw new InvalidOperationException($"Mod QuickDownload `{content.QuickDownload}` definition not found.");
|
||||
|
||||
|
||||
@@ -274,7 +274,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
var botTypes = map.PlayerActorInfo.TraitInfos<IBotInfo>().Select(t => t.Type);
|
||||
var options = new Dictionary<string, IEnumerable<DropDownOption>>();
|
||||
|
||||
var botController = orderManager.LobbyInfo.Clients.Find(c => c.IsAdmin);
|
||||
var botController = orderManager.LobbyInfo.Clients.FirstOrDefault(c => c.IsAdmin);
|
||||
if (orderManager.LobbyInfo.Slots.Values.Any(s => s.AllowBots))
|
||||
{
|
||||
var botOptions = new List<DropDownOption>()
|
||||
|
||||
@@ -74,7 +74,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
{
|
||||
foreach (var b in map.PlayerActorInfo.TraitInfos<IBotInfo>())
|
||||
{
|
||||
var botController = orderManager.LobbyInfo.Clients.Find(c => c.IsAdmin);
|
||||
var botController = orderManager.LobbyInfo.Clients.FirstOrDefault(c => c.IsAdmin);
|
||||
bots.Add(new SlotDropDownOption(b.Name,
|
||||
$"slot_bot {slot.PlayerReference} {botController.Index} {b.Type}",
|
||||
() => client != null && client.Bot == b.Type));
|
||||
@@ -266,7 +266,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
static void ClearPlayerSpawnPoint(OrderManager orderManager, MapPreviewWidget mapPreview, MapPreview preview, MouseInput mi)
|
||||
{
|
||||
var selectedSpawn = DetermineSelectedSpawnPoint(mapPreview, preview, mi);
|
||||
if (Game.IsHost || orderManager.LobbyInfo.Clients.Find(cc => cc.SpawnPoint == selectedSpawn) == orderManager.LocalClient)
|
||||
if (Game.IsHost || orderManager.LobbyInfo.Clients.FirstOrDefault(cc => cc.SpawnPoint == selectedSpawn) == orderManager.LocalClient)
|
||||
orderManager.IssueOrder(Order.Command($"clear_spawn {selectedSpawn}"));
|
||||
}
|
||||
|
||||
|
||||
@@ -356,7 +356,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
|
||||
gameModeDropdown.GetText = () =>
|
||||
{
|
||||
var item = categories.Find(m => m.Category == category);
|
||||
var item = categories.FirstOrDefault(m => m.Category == category);
|
||||
if (item == default((string, int)))
|
||||
item.Category = TranslationProvider.GetString(NoMatches);
|
||||
|
||||
|
||||
@@ -696,7 +696,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
|
||||
void SelectFirstVisibleReplay()
|
||||
{
|
||||
SelectReplay(replays.Find(r => replayState[r].Visible));
|
||||
SelectReplay(replays.FirstOrDefault(r => replayState[r].Visible));
|
||||
}
|
||||
|
||||
void SelectReplay(ReplayMetadata replay)
|
||||
|
||||
@@ -103,7 +103,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
videoVolumeSlider.OnChange += x => Game.Sound.VideoVolume = x;
|
||||
|
||||
var devices = Game.Sound.AvailableDevices();
|
||||
soundDevice = Array.Find(devices, d => d.Device == ss.Device) ?? devices[0];
|
||||
soundDevice = devices.FirstOrDefault(d => d.Device == ss.Device) ?? devices[0];
|
||||
|
||||
var audioDeviceDropdown = panel.Get<DropDownButtonWidget>("AUDIO_DEVICE");
|
||||
audioDeviceDropdown.OnMouseDown = _ => ShowAudioDeviceDropdown(audioDeviceDropdown, devices, scrollPanel);
|
||||
|
||||
@@ -38,7 +38,7 @@ namespace OpenRA.Mods.Common.Widgets
|
||||
{
|
||||
resourceType = value;
|
||||
if (resourceType != null)
|
||||
resourceRenderer = Array.Find(resourceRenderers, r => r.ResourceTypes.Contains(resourceType));
|
||||
resourceRenderer = resourceRenderers.FirstOrDefault(r => r.ResourceTypes.Contains(resourceType));
|
||||
else
|
||||
resourceRenderer = null;
|
||||
}
|
||||
|
||||
@@ -283,7 +283,7 @@ namespace OpenRA.Mods.Common.Widgets
|
||||
|
||||
public void ScrollToItem(string itemKey, bool smooth = false)
|
||||
{
|
||||
var item = Children.Find(c => c is ScrollItemWidget si && si.ItemKey == itemKey);
|
||||
var item = Children.FirstOrDefault(c => c is ScrollItemWidget si && si.ItemKey == itemKey);
|
||||
|
||||
if (item != null)
|
||||
ScrollToItem(item, smooth);
|
||||
@@ -291,7 +291,7 @@ namespace OpenRA.Mods.Common.Widgets
|
||||
|
||||
public void ScrollToSelectedItem()
|
||||
{
|
||||
var item = Children.Find(c => c is ScrollItemWidget si && si.IsSelected());
|
||||
var item = Children.FirstOrDefault(c => c is ScrollItemWidget si && si.IsSelected());
|
||||
|
||||
if (item != null)
|
||||
ScrollToItem(item);
|
||||
@@ -468,7 +468,7 @@ namespace OpenRA.Mods.Common.Widgets
|
||||
if (collection != col)
|
||||
return;
|
||||
|
||||
var widget = Children.Find(w => widgetItemEquals(w, item));
|
||||
var widget = Children.FirstOrDefault(w => widgetItemEquals(w, item));
|
||||
if (widget != null)
|
||||
RemoveChild(widget);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user