diff --git a/.editorconfig b/.editorconfig index 7f2c379250..504b3085cf 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1023,6 +1023,9 @@ dotnet_diagnostic.RCS1072.severity = warning # Remove redundant constructor. dotnet_diagnostic.RCS1074.severity = warning +# Optimize LINQ method call. +dotnet_diagnostic.RCS1077.severity = warning + # Use 'Count' property instead of 'Any' method. dotnet_diagnostic.RCS1080.severity = warning diff --git a/OpenRA.Game/FileSystem/FileSystem.cs b/OpenRA.Game/FileSystem/FileSystem.cs index f6518ee173..110028d3df 100644 --- a/OpenRA.Game/FileSystem/FileSystem.cs +++ b/OpenRA.Game/FileSystem/FileSystem.cs @@ -328,7 +328,7 @@ namespace OpenRA.FileSystem if (name == ".") continue; - resolved = Directory.GetFileSystemEntries(resolved).FirstOrDefault(e => e.Equals(Path.Combine(resolved, name), StringComparison.InvariantCultureIgnoreCase)); + resolved = Array.Find(Directory.GetFileSystemEntries(resolved), e => e.Equals(Path.Combine(resolved, name), StringComparison.InvariantCultureIgnoreCase)); if (resolved == null) return null; diff --git a/OpenRA.Game/GameRules/ActorInfo.cs b/OpenRA.Game/GameRules/ActorInfo.cs index 710b08f865..2c506c6c62 100644 --- a/OpenRA.Game/GameRules/ActorInfo.cs +++ b/OpenRA.Game/GameRules/ActorInfo.cs @@ -162,7 +162,7 @@ namespace OpenRA throw new YamlException(exceptionString); } - constructOrderCache = resolved.Select(r => r.Trait).ToList(); + constructOrderCache = resolved.ConvertAll(r => r.Trait); return constructOrderCache; } diff --git a/OpenRA.Game/MiniYaml.cs b/OpenRA.Game/MiniYaml.cs index 6320e46250..3d160b3994 100644 --- a/OpenRA.Game/MiniYaml.cs +++ b/OpenRA.Game/MiniYaml.cs @@ -670,7 +670,7 @@ namespace OpenRA public MiniYamlBuilder(string value, List nodes) { Value = value; - Nodes = nodes == null ? new List() : nodes.Select(x => new MiniYamlNodeBuilder(x)).ToList(); + Nodes = nodes == null ? new List() : nodes.ConvertAll(x => new MiniYamlNodeBuilder(x)); } public MiniYaml Build() diff --git a/OpenRA.Game/Network/UnitOrders.cs b/OpenRA.Game/Network/UnitOrders.cs index a2e365b1ad..837ddf5190 100644 --- a/OpenRA.Game/Network/UnitOrders.cs +++ b/OpenRA.Game/Network/UnitOrders.cs @@ -9,6 +9,7 @@ */ #endregion +using System; using System.Collections.Generic; using System.Linq; using OpenRA.Server; @@ -42,7 +43,7 @@ namespace OpenRA.Network static Player FindPlayerByClient(this World world, Session.Client c) { - return world.Players.FirstOrDefault(p => p.ClientIndex == c.Index && p.PlayerReference.Playable); + return Array.Find(world.Players, p => p.ClientIndex == c.Index && p.PlayerReference.Playable); } static bool OrderNotFromServerOrWorldIsReplay(int clientId, World world) => clientId != 0 || (world != null && world.IsReplay); @@ -184,12 +185,12 @@ namespace OpenRA.Network if (!string.IsNullOrEmpty(order.TargetString)) { var data = MiniYaml.FromString(order.TargetString); - var saveLastOrdersFrame = data.FirstOrDefault(n => n.Key == "SaveLastOrdersFrame"); + var saveLastOrdersFrame = data.Find(n => n.Key == "SaveLastOrdersFrame"); if (saveLastOrdersFrame != null) orderManager.GameSaveLastFrame = FieldLoader.GetValue("saveLastOrdersFrame", saveLastOrdersFrame.Value.Value); - var saveSyncFrame = data.FirstOrDefault(n => n.Key == "SaveSyncFrame"); + var saveSyncFrame = data.Find(n => n.Key == "SaveSyncFrame"); if (saveSyncFrame != null) orderManager.GameSaveLastSyncFrame = FieldLoader.GetValue("SaveSyncFrame", saveSyncFrame.Value.Value); @@ -374,7 +375,7 @@ namespace OpenRA.Network var strings = node.Key.Split('@'); if (strings[0] == "ConnectionQuality") { - var client = orderManager.LobbyInfo.Clients.FirstOrDefault(c => c.Index == Exts.ParseInt32Invariant(strings[1])); + var client = orderManager.LobbyInfo.Clients.Find(c => c.Index == Exts.ParseInt32Invariant(strings[1])); if (client != null) client.ConnectionQuality = FieldLoader.GetValue("ConnectionQuality", node.Value.Value); } diff --git a/OpenRA.Game/Player.cs b/OpenRA.Game/Player.cs index 20ba3c35fe..36602f14a7 100644 --- a/OpenRA.Game/Player.cs +++ b/OpenRA.Game/Player.cs @@ -109,14 +109,14 @@ namespace OpenRA .Where(f => !requireSelectable || f.Selectable) .ToList(); - var selected = selectableFactions.FirstOrDefault(f => f.InternalName == factionName) + var selected = selectableFactions.Find(f => f.InternalName == factionName) ?? selectableFactions.Random(playerRandom); // Don't loop infinite for (var i = 0; i <= 10 && selected.RandomFactionMembers.Count > 0; i++) { var faction = selected.RandomFactionMembers.Random(playerRandom); - selected = selectableFactions.FirstOrDefault(f => f.InternalName == faction); + selected = selectableFactions.Find(f => f.InternalName == faction); if (selected == null) throw new YamlException($"Unknown faction: {faction}"); @@ -179,7 +179,7 @@ namespace OpenRA else { // Map player - ClientIndex = world.LobbyInfo.Clients.FirstOrDefault(c => c.IsAdmin)?.Index ?? 0; // Owned by the host (TODO: fix this) + ClientIndex = world.LobbyInfo.Clients.Find(c => c.IsAdmin)?.Index ?? 0; // Owned by the host (TODO: fix this) Color = pr.Color; PlayerName = pr.Name; NonCombatant = pr.NonCombatant; diff --git a/OpenRA.Game/Scripting/ScriptContext.cs b/OpenRA.Game/Scripting/ScriptContext.cs index 16de82dd5f..7592972360 100644 --- a/OpenRA.Game/Scripting/ScriptContext.cs +++ b/OpenRA.Game/Scripting/ScriptContext.cs @@ -211,7 +211,7 @@ namespace OpenRA.Scripting var bindings = Game.ModData.ObjectCreator.GetTypesImplementing(); foreach (var b in bindings) { - var ctor = b.GetConstructors(BindingFlags.Public | BindingFlags.Instance).FirstOrDefault(c => + var ctor = Array.Find(b.GetConstructors(BindingFlags.Public | BindingFlags.Instance), c => { var p = c.GetParameters(); return p.Length == 1 && p.First().ParameterType == typeof(ScriptContext); diff --git a/OpenRA.Game/Server/Server.cs b/OpenRA.Game/Server/Server.cs index 94f0ac24c3..0d15a2ff3b 100644 --- a/OpenRA.Game/Server/Server.cs +++ b/OpenRA.Game/Server/Server.cs @@ -1160,7 +1160,7 @@ namespace OpenRA.Server } public bool HasClientWonOrLost(Session.Client client) => - worldPlayers.FirstOrDefault(p => p?.ClientIndex == client.Index)?.Outcome != WinState.Undefined; + worldPlayers.Find(p => p?.ClientIndex == client.Index)?.Outcome != WinState.Undefined; public void DropClient(Connection toDrop) { @@ -1169,7 +1169,7 @@ namespace OpenRA.Server orderBuffer?.RemovePlayer(toDrop.PlayerIndex); Conns.Remove(toDrop); - var dropClient = LobbyInfo.Clients.FirstOrDefault(c => c.Index == toDrop.PlayerIndex); + var dropClient = LobbyInfo.Clients.Find(c => c.Index == toDrop.PlayerIndex); if (dropClient == null) { toDrop.Dispose(); @@ -1251,7 +1251,7 @@ namespace OpenRA.Server lock (LobbyInfo) { // TODO: Only need to sync the specific client that has changed to avoid conflicts! - var clientData = LobbyInfo.Clients.Select(client => client.Serialize()).ToList(); + var clientData = LobbyInfo.Clients.ConvertAll(client => client.Serialize()); DispatchServerOrdersToClients(Order.FromTargetString("SyncLobbyClients", clientData.WriteToString(), true)); diff --git a/OpenRA.Game/Settings.cs b/OpenRA.Game/Settings.cs index 942ebc097b..c11e499627 100644 --- a/OpenRA.Game/Settings.cs +++ b/OpenRA.Game/Settings.cs @@ -348,7 +348,7 @@ namespace OpenRA LoadSectionYaml(yamlSection.Value, settingsSection); } - var keysNode = yamlCache.FirstOrDefault(n => n.Key == "Keys"); + var keysNode = yamlCache.Find(n => n.Key == "Keys"); if (keysNode != null) foreach (var node in keysNode.Value.Nodes) if (node.Key != null) @@ -370,10 +370,10 @@ namespace OpenRA public void Save() { - var yamlCacheBuilder = yamlCache.Select(n => new MiniYamlNodeBuilder(n)).ToList(); + var yamlCacheBuilder = yamlCache.ConvertAll(n => new MiniYamlNodeBuilder(n)); foreach (var kv in Sections) { - var sectionYaml = yamlCacheBuilder.FirstOrDefault(x => x.Key == kv.Key); + var sectionYaml = yamlCacheBuilder.Find(x => x.Key == kv.Key); if (sectionYaml == null) { sectionYaml = new MiniYamlNodeBuilder(kv.Key, new MiniYamlBuilder("")); @@ -403,7 +403,7 @@ namespace OpenRA } } - var keysYaml = yamlCacheBuilder.FirstOrDefault(x => x.Key == "Keys"); + var keysYaml = yamlCacheBuilder.Find(x => x.Key == "Keys"); if (keysYaml == null) { keysYaml = new MiniYamlNodeBuilder("Keys", new MiniYamlBuilder("")); diff --git a/OpenRA.Game/UtilityCommands/ExtractChromeStrings.cs b/OpenRA.Game/UtilityCommands/ExtractChromeStrings.cs index 5f13df43a0..9f211ad99a 100644 --- a/OpenRA.Game/UtilityCommands/ExtractChromeStrings.cs +++ b/OpenRA.Game/UtilityCommands/ExtractChromeStrings.cs @@ -59,7 +59,7 @@ namespace OpenRA.UtilityCommands modData.ModFiles.TryGetPackageContaining(chrome, out var chromePackage, out var chromeName); var chromePath = Path.Combine(chromePackage.Name, chromeName); - var yaml = MiniYaml.FromFile(chromePath, false).Select(n => new MiniYamlNodeBuilder(n)).ToList(); + var yaml = MiniYaml.FromFile(chromePath, false).ConvertAll(n => new MiniYamlNodeBuilder(n)); chromeFiles.Add((chromePath, yaml)); var translationCandidates = new List(); diff --git a/OpenRA.Mods.Cnc/Scripting/Properties/InfiltrateProperties.cs b/OpenRA.Mods.Cnc/Scripting/Properties/InfiltrateProperties.cs index e9d8a646b1..11ee26e5b8 100644 --- a/OpenRA.Mods.Cnc/Scripting/Properties/InfiltrateProperties.cs +++ b/OpenRA.Mods.Cnc/Scripting/Properties/InfiltrateProperties.cs @@ -9,6 +9,7 @@ */ #endregion +using System; using System.Linq; using Eluant; using OpenRA.Mods.Cnc.Activities; @@ -32,7 +33,7 @@ namespace OpenRA.Mods.Cnc.Scripting [Desc("Infiltrate the target actor.")] public void Infiltrate(Actor target) { - var infiltrates = infiltratesTraits.FirstOrDefault(x => !x.IsTraitDisabled && x.Info.Types.Overlaps(target.GetEnabledTargetTypes())); + var infiltrates = Array.Find(infiltratesTraits, x => !x.IsTraitDisabled && x.Info.Types.Overlaps(target.GetEnabledTargetTypes())); if (infiltrates == null) throw new LuaException($"{Self} tried to infiltrate invalid target {target}!"); diff --git a/OpenRA.Mods.Cnc/Traits/SupportPowers/GrantPrerequisiteChargeDrainPower.cs b/OpenRA.Mods.Cnc/Traits/SupportPowers/GrantPrerequisiteChargeDrainPower.cs index 553c005495..0cb1749955 100644 --- a/OpenRA.Mods.Cnc/Traits/SupportPowers/GrantPrerequisiteChargeDrainPower.cs +++ b/OpenRA.Mods.Cnc/Traits/SupportPowers/GrantPrerequisiteChargeDrainPower.cs @@ -161,7 +161,7 @@ namespace OpenRA.Mods.Cnc.Traits if (!available || order.ExtraData != 1) return; - var power = Instances.FirstOrDefault(i => !i.IsTraitPaused); + var power = Instances.Find(i => !i.IsTraitPaused); if (power == null) return; diff --git a/OpenRA.Mods.Cnc/UtilityCommands/ConvertPngToShpCommand.cs b/OpenRA.Mods.Cnc/UtilityCommands/ConvertPngToShpCommand.cs index 30bcac3842..79fba50415 100644 --- a/OpenRA.Mods.Cnc/UtilityCommands/ConvertPngToShpCommand.cs +++ b/OpenRA.Mods.Cnc/UtilityCommands/ConvertPngToShpCommand.cs @@ -35,7 +35,7 @@ namespace OpenRA.Mods.Cnc.UtilityCommands var inputFiles = GlobArgs(args).OrderBy(a => a).ToList(); var dest = inputFiles[0].Split('-').First() + ".shp"; - var frames = inputFiles.Select(a => new Png(File.OpenRead(a))).ToList(); + var frames = inputFiles.ConvertAll(a => new Png(File.OpenRead(a))); if (frames.Any(f => f.Type != SpriteFrameType.Indexed8)) throw new InvalidOperationException("All frames must be paletted"); diff --git a/OpenRA.Mods.Common/Activities/LayMines.cs b/OpenRA.Mods.Common/Activities/LayMines.cs index fb5740af16..0fc25b4764 100644 --- a/OpenRA.Mods.Common/Activities/LayMines.cs +++ b/OpenRA.Mods.Common/Activities/LayMines.cs @@ -9,6 +9,7 @@ */ #endregion +using System; using System.Collections.Generic; using System.Linq; using OpenRA.Activities; @@ -175,7 +176,7 @@ namespace OpenRA.Mods.Common.Activities { if (ammoPools != null) { - var pool = ammoPools.FirstOrDefault(x => x.Info.Name == minelayer.Info.AmmoPoolName); + var pool = Array.Find(ammoPools, x => x.Info.Name == minelayer.Info.AmmoPoolName); if (pool == null) return false; @@ -193,7 +194,7 @@ namespace OpenRA.Mods.Common.Activities { if (ammoPools != null) { - var pool = ammoPools.FirstOrDefault(x => x.Info.Name == minelayer.Info.AmmoPoolName); + var pool = Array.Find(ammoPools, x => x.Info.Name == minelayer.Info.AmmoPoolName); if (pool == null) return false; diff --git a/OpenRA.Mods.Common/Activities/Resupply.cs b/OpenRA.Mods.Common/Activities/Resupply.cs index f8316f08ed..3b5478fb14 100644 --- a/OpenRA.Mods.Common/Activities/Resupply.cs +++ b/OpenRA.Mods.Common/Activities/Resupply.cs @@ -141,7 +141,7 @@ namespace OpenRA.Mods.Common.Activities QueueChild(move.MoveWithinRange(host, closeEnough, targetLineColor: moveInfo.GetTargetLineColor())); var delta = (self.CenterPosition - host.CenterPosition).LengthSquared; - transportCallers.FirstOrDefault(t => t.MinimumDistance.LengthSquared < delta)?.RequestTransport(self, targetCell); + Array.Find(transportCallers, t => t.MinimumDistance.LengthSquared < delta)?.RequestTransport(self, targetCell); return false; } @@ -256,7 +256,7 @@ namespace OpenRA.Mods.Common.Activities void RepairTick(Actor self) { - var repairsUnits = allRepairsUnits.FirstOrDefault(r => !r.IsTraitDisabled && !r.IsTraitPaused); + var repairsUnits = Array.Find(allRepairsUnits, r => !r.IsTraitDisabled && !r.IsTraitPaused); if (repairsUnits == null) { if (!allRepairsUnits.Any(r => r.IsTraitPaused)) diff --git a/OpenRA.Mods.Common/FileFormats/MSCabCompression.cs b/OpenRA.Mods.Common/FileFormats/MSCabCompression.cs index 3990bf8eed..96870efd5a 100644 --- a/OpenRA.Mods.Common/FileFormats/MSCabCompression.cs +++ b/OpenRA.Mods.Common/FileFormats/MSCabCompression.cs @@ -89,7 +89,7 @@ namespace OpenRA.Mods.Common.FileFormats public void ExtractFile(string filename, Stream output, Action onProgress = null) { - var file = files.FirstOrDefault(f => f.FileName == filename); + var file = Array.Find(files, f => f.FileName == filename); if (file == null) throw new FileNotFoundException(filename); diff --git a/OpenRA.Mods.Common/HitShapes/Rectangle.cs b/OpenRA.Mods.Common/HitShapes/Rectangle.cs index 0d39bb492a..2fcb9d1951 100644 --- a/OpenRA.Mods.Common/HitShapes/Rectangle.cs +++ b/OpenRA.Mods.Common/HitShapes/Rectangle.cs @@ -69,7 +69,7 @@ namespace OpenRA.Mods.Common.HitShapes var topRight = new int2(BottomRight.X, TopLeft.Y); var bottomLeft = new int2(TopLeft.X, BottomRight.Y); var corners = new[] { TopLeft, BottomRight, topRight, bottomLeft }; - OuterRadius = new WDist(corners.Select(x => x.Length).Max()); + OuterRadius = new WDist(corners.Max(x => x.Length)); combatOverlayVertsTop = new WVec[] { diff --git a/OpenRA.Mods.Common/Scripting/Global/PlayerGlobal.cs b/OpenRA.Mods.Common/Scripting/Global/PlayerGlobal.cs index cd41a413a7..4ceca1a3f9 100644 --- a/OpenRA.Mods.Common/Scripting/Global/PlayerGlobal.cs +++ b/OpenRA.Mods.Common/Scripting/Global/PlayerGlobal.cs @@ -9,6 +9,7 @@ */ #endregion +using System; using System.Linq; using Eluant; using OpenRA.Scripting; @@ -24,7 +25,7 @@ namespace OpenRA.Mods.Common.Scripting [Desc("Returns the player with the specified internal name, or nil if a match is not found.")] public Player GetPlayer(string name) { - return Context.World.Players.FirstOrDefault(p => p.InternalName == name); + return Array.Find(Context.World.Players, p => p.InternalName == name); } [Desc("Returns a table of players filtered by the specified function.")] diff --git a/OpenRA.Mods.Common/Scripting/Properties/AmmoPoolProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/AmmoPoolProperties.cs index 3b7d3b73bf..9c63ddfbf0 100644 --- a/OpenRA.Mods.Common/Scripting/Properties/AmmoPoolProperties.cs +++ b/OpenRA.Mods.Common/Scripting/Properties/AmmoPoolProperties.cs @@ -9,6 +9,7 @@ */ #endregion +using System; using System.Linq; using Eluant; using OpenRA.Mods.Common.Traits; @@ -33,7 +34,7 @@ namespace OpenRA.Mods.Common.Scripting [Desc("Returns the count of the actor's specified ammopool.")] public int AmmoCount(string poolName = "primary") { - var pool = ammoPools.FirstOrDefault(a => a.Info.Name == poolName); + var pool = Array.Find(ammoPools, a => a.Info.Name == poolName); if (pool == null) throw new LuaException($"Invalid ammopool name {poolName} queried on actor {self}."); @@ -43,7 +44,7 @@ namespace OpenRA.Mods.Common.Scripting [Desc("Returns the maximum count of ammo the actor can load.")] public int MaximumAmmoCount(string poolName = "primary") { - var pool = ammoPools.FirstOrDefault(a => a.Info.Name == poolName); + var pool = Array.Find(ammoPools, a => a.Info.Name == poolName); if (pool == null) throw new LuaException($"Invalid ammopool name {poolName} queried on actor {self}."); @@ -54,7 +55,7 @@ namespace OpenRA.Mods.Common.Scripting "(Use a negative amount to remove ammo.)")] public void Reload(string poolName = "primary", int amount = 1) { - var pool = ammoPools.FirstOrDefault(a => a.Info.Name == poolName); + var pool = Array.Find(ammoPools, a => a.Info.Name == poolName); if (pool == null) throw new LuaException($"Invalid ammopool name {poolName} queried on actor {self}."); diff --git a/OpenRA.Mods.Common/Scripting/Properties/ConditionProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/ConditionProperties.cs index 2a90126242..a2da37bdd6 100644 --- a/OpenRA.Mods.Common/Scripting/Properties/ConditionProperties.cs +++ b/OpenRA.Mods.Common/Scripting/Properties/ConditionProperties.cs @@ -9,6 +9,7 @@ */ #endregion +using System; using System.Linq; using Eluant; using OpenRA.Mods.Common.Traits; @@ -33,8 +34,7 @@ namespace OpenRA.Mods.Common.Scripting "If duration > 0 the condition will be automatically revoked after the defined number of ticks.")] public int GrantCondition(string condition, int duration = 0) { - var external = externalConditions - .FirstOrDefault(t => t.Info.Condition == condition && t.CanGrantCondition(this)); + var external = Array.Find(externalConditions, t => t.Info.Condition == condition && t.CanGrantCondition(this)); if (external == null) throw new LuaException($"Condition `{condition}` has not been listed on an enabled ExternalCondition trait"); diff --git a/OpenRA.Mods.Common/Scripting/Properties/PlayerConditionProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/PlayerConditionProperties.cs index 8164d14c97..280fe19588 100644 --- a/OpenRA.Mods.Common/Scripting/Properties/PlayerConditionProperties.cs +++ b/OpenRA.Mods.Common/Scripting/Properties/PlayerConditionProperties.cs @@ -9,6 +9,7 @@ */ #endregion +using System; using System.Linq; using Eluant; using OpenRA.Mods.Common.Traits; @@ -32,8 +33,7 @@ namespace OpenRA.Mods.Common.Scripting "If duration > 0 the condition will be automatically revoked after the defined number of ticks.")] public int GrantCondition(string condition, int duration = 0) { - var external = externalConditions - .FirstOrDefault(t => t.Info.Condition == condition && t.CanGrantCondition(this)); + var external = Array.Find(externalConditions, t => t.Info.Condition == condition && t.CanGrantCondition(this)); if (external == null) throw new LuaException($"Condition `{condition}` has not been listed on an enabled ExternalCondition trait"); diff --git a/OpenRA.Mods.Common/Scripting/Properties/PlayerProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/PlayerProperties.cs index 8b62a6fb86..eeb645376c 100644 --- a/OpenRA.Mods.Common/Scripting/Properties/PlayerProperties.cs +++ b/OpenRA.Mods.Common/Scripting/Properties/PlayerProperties.cs @@ -47,7 +47,7 @@ namespace OpenRA.Mods.Common.Scripting { get { - var c = Player.World.LobbyInfo.Clients.FirstOrDefault(i => i.Index == Player.ClientIndex); + var c = Player.World.LobbyInfo.Clients.Find(i => i.Index == Player.ClientIndex); return c?.Team ?? 0; } } @@ -57,7 +57,7 @@ namespace OpenRA.Mods.Common.Scripting { get { - var c = Player.World.LobbyInfo.Clients.FirstOrDefault(i => i.Index == Player.ClientIndex); + var c = Player.World.LobbyInfo.Clients.Find(i => i.Index == Player.ClientIndex); return c?.Handicap ?? 0; } } diff --git a/OpenRA.Mods.Common/Scripting/Properties/ProductionProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/ProductionProperties.cs index 5e0e631493..9ff58430cf 100644 --- a/OpenRA.Mods.Common/Scripting/Properties/ProductionProperties.cs +++ b/OpenRA.Mods.Common/Scripting/Properties/ProductionProperties.cs @@ -187,8 +187,7 @@ namespace OpenRA.Mods.Common.Scripting if (triggers.HasAnyCallbacksFor(Trigger.OnProduction)) return true; - return queues.Where(q => GetBuildableInfo(actorType).Queue.Contains(q.Info.Type)) - .Any(q => q.AllQueued().Any()); + return queues.Any(q => GetBuildableInfo(actorType).Queue.Contains(q.Info.Type) && q.AllQueued().Any()); } BuildableInfo GetBuildableInfo(string actorType) diff --git a/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs b/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs index 42810149e7..b7185e63cf 100644 --- a/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs +++ b/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs @@ -278,7 +278,7 @@ namespace OpenRA.Mods.Common.Server { // Client 0 will always be the Host // In some cases client 0 doesn't exist, so we untick all players - var host = server.LobbyInfo.Clients.FirstOrDefault(c => c.Index == 0); + var host = server.LobbyInfo.Clients.Find(c => c.Index == 0); if (host != null) host.State = Session.ClientState.NotReady; else @@ -442,7 +442,7 @@ namespace OpenRA.Mods.Common.Server } else { - var occupantConn = server.Conns.FirstOrDefault(c => c.PlayerIndex == occupant.Index); + var occupantConn = server.Conns.Find(c => c.PlayerIndex == occupant.Index); if (occupantConn != null) { server.SendOrderTo(conn, "ServerError", SlotClosed); @@ -1143,7 +1143,7 @@ namespace OpenRA.Mods.Common.Server if (spawnPoint == 0) return true; - var existingClient = server.LobbyInfo.Clients.FirstOrDefault(cc => cc.SpawnPoint == spawnPoint); + var existingClient = server.LobbyInfo.Clients.Find(cc => cc.SpawnPoint == spawnPoint); if (client != existingClient && !client.IsAdmin) { server.SendLocalizedMessageTo(conn, AdminClearSpawn); @@ -1200,7 +1200,7 @@ namespace OpenRA.Mods.Common.Server return true; } - if (server.LobbyInfo.Clients.Where(cc => cc != client).Any(cc => (cc.SpawnPoint == spawnPoint) && (cc.SpawnPoint != 0))) + if (server.LobbyInfo.Clients.Any(cc => cc != client && (cc.SpawnPoint == spawnPoint) && (cc.SpawnPoint != 0))) { server.SendLocalizedMessageTo(conn, SpawnOccupied); return true; diff --git a/OpenRA.Mods.Common/ServerTraits/SkirmishLogic.cs b/OpenRA.Mods.Common/ServerTraits/SkirmishLogic.cs index 537ef429bd..e3585733d3 100644 --- a/OpenRA.Mods.Common/ServerTraits/SkirmishLogic.cs +++ b/OpenRA.Mods.Common/ServerTraits/SkirmishLogic.cs @@ -165,7 +165,7 @@ namespace OpenRA.Mods.Common.Server var slot = server.LobbyInfo.FirstEmptyBotSlot(); var bot = server.Map.PlayerActorInfo.TraitInfos().Select(t => t.Type).FirstOrDefault(); - var botController = server.LobbyInfo.Clients.FirstOrDefault(c => c.IsAdmin); + var botController = server.LobbyInfo.Clients.Find(c => c.IsAdmin); if (slot != null && bot != null) server.InterpretCommand($"slot_bot {slot} {botController.Index} {bot}", conn); } diff --git a/OpenRA.Mods.Common/Traits/AttackMove.cs b/OpenRA.Mods.Common/Traits/AttackMove.cs index 8088170e99..71b32cab3c 100644 --- a/OpenRA.Mods.Common/Traits/AttackMove.cs +++ b/OpenRA.Mods.Common/Traits/AttackMove.cs @@ -9,6 +9,7 @@ */ #endregion +using System; using System.Collections.Generic; using System.Linq; using OpenRA.Mods.Common.Activities; @@ -162,7 +163,7 @@ namespace OpenRA.Mods.Common.Traits if (world.Map.Contains(cell)) { var explored = subject.Actor.Owner.Shroud.IsExplored(cell); - var cannotMove = subjects.FirstOrDefault(a => !a.Trait.Info.MoveIntoShroud).Trait; + var cannotMove = Array.Find(subjects, a => !a.Trait.Info.MoveIntoShroud).Trait; var blocked = !explored && cannotMove != null; if (isAssaultMove) diff --git a/OpenRA.Mods.Common/Traits/BotModules/SquadManagerBotModule.cs b/OpenRA.Mods.Common/Traits/BotModules/SquadManagerBotModule.cs index f414cd66ab..81a8d7f4a3 100644 --- a/OpenRA.Mods.Common/Traits/BotModules/SquadManagerBotModule.cs +++ b/OpenRA.Mods.Common/Traits/BotModules/SquadManagerBotModule.cs @@ -305,7 +305,7 @@ namespace OpenRA.Mods.Common.Traits // HACK: Use of this function requires that there is one squad of this type. Squad GetSquadOfType(SquadType type) { - return Squads.FirstOrDefault(s => s.Type == type); + return Squads.Find(s => s.Type == type); } Squad RegisterNewSquad(IBot bot, SquadType type, (Actor Actor, WVec Offset) target = default) @@ -446,7 +446,7 @@ namespace OpenRA.Mods.Common.Traits ownUnits.First()) .ToList(); - if (AttackOrFleeFuzzy.Rush.CanAttack(ownUnits, enemies.Select(x => x.Actor).ToList())) + if (AttackOrFleeFuzzy.Rush.CanAttack(ownUnits, enemies.ConvertAll(x => x.Actor))) { var target = enemies.Count > 0 ? enemies.Random(World.LocalRandom) : enemyBaseBuilder; var rush = GetSquadOfType(SquadType.Rush); @@ -508,7 +508,7 @@ namespace OpenRA.Mods.Common.Traits return new List() { - new("Squads", "", Squads.Select(s => new MiniYamlNode("Squad", s.Serialize())).ToList()), + new("Squads", "", Squads.ConvertAll(s => new MiniYamlNode("Squad", s.Serialize()))), new("InitialBaseCenter", FieldSaver.FormatValue(initialBaseCenter)), new("UnitsHangingAroundTheBase", FieldSaver.FormatValue(unitsHangingAroundTheBase .Where(a => !unitCannotBeOrdered(a)) diff --git a/OpenRA.Mods.Common/Traits/Buildings/Exit.cs b/OpenRA.Mods.Common/Traits/Buildings/Exit.cs index 72ccf77fd0..c75fd5aa45 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/Exit.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/Exit.cs @@ -57,7 +57,9 @@ namespace OpenRA.Mods.Common.Traits .ThenBy(e => (actor.World.Map.CenterOfCell(actor.Location + e.Info.ExitCell) - pos).LengthSquared) .ToList(); +#pragma warning disable RCS1077 // Optimize LINQ method call. return p != null ? all.FirstOrDefault(p) : all.FirstOrDefault(); +#pragma warning restore RCS1077 // Optimize LINQ method call. } public static IEnumerable Exits(this Actor actor, string productionType = null) diff --git a/OpenRA.Mods.Common/Traits/Buildings/TransformsIntoAircraft.cs b/OpenRA.Mods.Common/Traits/Buildings/TransformsIntoAircraft.cs index 7d4333c418..6cbdb63e09 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/TransformsIntoAircraft.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/TransformsIntoAircraft.cs @@ -9,6 +9,7 @@ */ #endregion +using System; using System.Collections.Generic; using System.Linq; using OpenRA.Mods.Common.Activities; @@ -142,7 +143,7 @@ namespace OpenRA.Mods.Common.Traits return; var currentTransform = self.CurrentActivity as Transform; - var transform = transforms.FirstOrDefault(t => !t.IsTraitDisabled && !t.IsTraitPaused); + var transform = Array.Find(transforms, t => !t.IsTraitDisabled && !t.IsTraitPaused); if (transform == null && currentTransform == null) return; diff --git a/OpenRA.Mods.Common/Traits/Buildings/TransformsIntoEntersTunnels.cs b/OpenRA.Mods.Common/Traits/Buildings/TransformsIntoEntersTunnels.cs index 19f0196833..adc208f88b 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/TransformsIntoEntersTunnels.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/TransformsIntoEntersTunnels.cs @@ -9,6 +9,7 @@ */ #endregion +using System; using System.Collections.Generic; using System.Linq; using OpenRA.Mods.Common.Activities; @@ -94,7 +95,7 @@ namespace OpenRA.Mods.Common.Traits return; var currentTransform = self.CurrentActivity as Transform; - var transform = transforms.FirstOrDefault(t => !t.IsTraitDisabled && !t.IsTraitPaused); + var transform = Array.Find(transforms, t => !t.IsTraitDisabled && !t.IsTraitPaused); if (transform == null && currentTransform == null) return; diff --git a/OpenRA.Mods.Common/Traits/Buildings/TransformsIntoMobile.cs b/OpenRA.Mods.Common/Traits/Buildings/TransformsIntoMobile.cs index d04046245d..dddff6fc8e 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/TransformsIntoMobile.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/TransformsIntoMobile.cs @@ -9,6 +9,7 @@ */ #endregion +using System; using System.Collections.Generic; using System.Linq; using OpenRA.Mods.Common.Activities; @@ -120,7 +121,7 @@ namespace OpenRA.Mods.Common.Traits return; var currentTransform = self.CurrentActivity as Transform; - var transform = transforms.FirstOrDefault(t => !t.IsTraitDisabled && !t.IsTraitPaused); + var transform = Array.Find(transforms, t => !t.IsTraitDisabled && !t.IsTraitPaused); if (transform == null && currentTransform == null) return; diff --git a/OpenRA.Mods.Common/Traits/Buildings/TransformsIntoPassenger.cs b/OpenRA.Mods.Common/Traits/Buildings/TransformsIntoPassenger.cs index 568e394492..bc82e4e9bb 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/TransformsIntoPassenger.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/TransformsIntoPassenger.cs @@ -9,6 +9,7 @@ */ #endregion +using System; using System.Collections.Generic; using System.Linq; using OpenRA.Mods.Common.Activities; @@ -128,7 +129,7 @@ namespace OpenRA.Mods.Common.Traits return; var currentTransform = self.CurrentActivity as Transform; - var transform = transforms.FirstOrDefault(t => !t.IsTraitDisabled && !t.IsTraitPaused); + var transform = Array.Find(transforms, t => !t.IsTraitDisabled && !t.IsTraitPaused); if (transform == null && currentTransform == null) return; diff --git a/OpenRA.Mods.Common/Traits/Buildings/TransformsIntoRepairable.cs b/OpenRA.Mods.Common/Traits/Buildings/TransformsIntoRepairable.cs index e569dce002..b6c85cbcf2 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/TransformsIntoRepairable.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/TransformsIntoRepairable.cs @@ -9,6 +9,7 @@ */ #endregion +using System; using System.Collections.Generic; using System.Linq; using OpenRA.Mods.Common.Activities; @@ -122,7 +123,7 @@ namespace OpenRA.Mods.Common.Traits return; var currentTransform = self.CurrentActivity as Transform; - var transform = transforms.FirstOrDefault(t => !t.IsTraitDisabled && !t.IsTraitPaused); + var transform = Array.Find(transforms, t => !t.IsTraitDisabled && !t.IsTraitPaused); if (transform == null && currentTransform == null) return; diff --git a/OpenRA.Mods.Common/Traits/Crates/GrantExternalConditionCrateAction.cs b/OpenRA.Mods.Common/Traits/Crates/GrantExternalConditionCrateAction.cs index 7997e642e2..53f7c72bcf 100644 --- a/OpenRA.Mods.Common/Traits/Crates/GrantExternalConditionCrateAction.cs +++ b/OpenRA.Mods.Common/Traits/Crates/GrantExternalConditionCrateAction.cs @@ -84,7 +84,7 @@ namespace OpenRA.Mods.Common.Traits { if (external == null || !external.CanGrantCondition(self)) { - external = externals.FirstOrDefault(t => t.CanGrantCondition(self)); + external = externals.Find(t => t.CanGrantCondition(self)); if (external == null) break; } diff --git a/OpenRA.Mods.Common/Traits/Minelayer.cs b/OpenRA.Mods.Common/Traits/Minelayer.cs index 324e10d8b8..a29c5a8a25 100644 --- a/OpenRA.Mods.Common/Traits/Minelayer.cs +++ b/OpenRA.Mods.Common/Traits/Minelayer.cs @@ -310,7 +310,7 @@ namespace OpenRA.Mods.Common.Traits protected override IEnumerable Render(WorldRenderer wr, World world) { yield break; } protected override IEnumerable RenderAboveShroud(WorldRenderer wr, World world) { - var minelayer = minelayers.FirstOrDefault(m => m.IsInWorld && !m.IsDead); + var minelayer = minelayers.Find(m => m.IsInWorld && !m.IsDead); if (minelayer == null) yield break; diff --git a/OpenRA.Mods.Common/Traits/Player/ClassicParallelProductionQueue.cs b/OpenRA.Mods.Common/Traits/Player/ClassicParallelProductionQueue.cs index 38f4f31b7f..a79046b279 100644 --- a/OpenRA.Mods.Common/Traits/Player/ClassicParallelProductionQueue.cs +++ b/OpenRA.Mods.Common/Traits/Player/ClassicParallelProductionQueue.cs @@ -84,7 +84,7 @@ namespace OpenRA.Mods.Common.Traits if (allProductionPaused) return; - var item = Queue.FirstOrDefault(i => !i.Paused); + var item = Queue.Find(i => !i.Paused); if (item == null) return; diff --git a/OpenRA.Mods.Common/Traits/Player/GameSaveViewportManager.cs b/OpenRA.Mods.Common/Traits/Player/GameSaveViewportManager.cs index 53722a18a1..880cb76b0b 100644 --- a/OpenRA.Mods.Common/Traits/Player/GameSaveViewportManager.cs +++ b/OpenRA.Mods.Common/Traits/Player/GameSaveViewportManager.cs @@ -9,8 +9,8 @@ */ #endregion +using System; using System.Collections.Generic; -using System.Linq; using OpenRA.Graphics; using OpenRA.Traits; @@ -34,7 +34,7 @@ namespace OpenRA.Mods.Common.Traits // TODO: This won't make sense for MP saves var localPlayer = worldRenderer.World.LocalPlayer; if ((localPlayer != null && localPlayer.PlayerActor != self) || - (localPlayer == null && self.Owner != self.World.Players.FirstOrDefault(p => p.IsBot))) + (localPlayer == null && self.Owner != Array.Find(self.World.Players, p => p.IsBot))) return null; var nodes = new List() diff --git a/OpenRA.Mods.Common/Traits/Player/ParallelProductionQueue.cs b/OpenRA.Mods.Common/Traits/Player/ParallelProductionQueue.cs index 6a1dfca704..d9e74d770f 100644 --- a/OpenRA.Mods.Common/Traits/Player/ParallelProductionQueue.cs +++ b/OpenRA.Mods.Common/Traits/Player/ParallelProductionQueue.cs @@ -27,7 +27,7 @@ namespace OpenRA.Mods.Common.Traits { CancelUnbuildableItems(); - var item = Queue.FirstOrDefault(i => !i.Paused); + var item = Queue.Find(i => !i.Paused); if (item == null) return; diff --git a/OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs b/OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs index 949d1c8c67..fd6b6fb08c 100644 --- a/OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs +++ b/OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs @@ -175,7 +175,7 @@ namespace OpenRA.Mods.Common.Traits .Where(p => p.AcceptsPlug(plugInfo.Type)) .ToList(); - var pluggable = pluggables.FirstOrDefault(p => a.Location + p.Info.Offset == targetLocation) + var pluggable = pluggables.Find(p => a.Location + p.Info.Offset == targetLocation) ?? pluggables.FirstOrDefault(); if (pluggable == null) diff --git a/OpenRA.Mods.Common/Traits/Player/ProductionQueue.cs b/OpenRA.Mods.Common/Traits/Player/ProductionQueue.cs index 4466b31e6e..0de33915a9 100644 --- a/OpenRA.Mods.Common/Traits/Player/ProductionQueue.cs +++ b/OpenRA.Mods.Common/Traits/Player/ProductionQueue.cs @@ -515,7 +515,7 @@ namespace OpenRA.Mods.Common.Traits protected virtual void PauseProduction(string itemName, bool paused) { - Queue.FirstOrDefault(a => a.Item == itemName)?.Pause(paused); + Queue.Find(a => a.Item == itemName)?.Pause(paused); } protected virtual void CancelProduction(string itemName, uint numberToCancel) diff --git a/OpenRA.Mods.Common/Traits/SupportPowers/SelectDirectionalTarget.cs b/OpenRA.Mods.Common/Traits/SupportPowers/SelectDirectionalTarget.cs index cdcaf268bd..81667a72b8 100644 --- a/OpenRA.Mods.Common/Traits/SupportPowers/SelectDirectionalTarget.cs +++ b/OpenRA.Mods.Common/Traits/SupportPowers/SelectDirectionalTarget.cs @@ -11,7 +11,6 @@ using System; using System.Collections.Generic; -using System.Linq; using OpenRA.Graphics; using OpenRA.Mods.Common.Widgets; using OpenRA.Orders; @@ -152,7 +151,7 @@ namespace OpenRA.Mods.Common.Traits Arrow GetArrow(double degree) { - var arrow = directionArrows.FirstOrDefault(d => d.EndAngle >= degree); + var arrow = Array.Find(directionArrows, d => d.EndAngle >= degree); return arrow ?? directionArrows[0]; } diff --git a/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs b/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs index dd47c8d738..140fc7adba 100644 --- a/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs +++ b/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs @@ -222,7 +222,7 @@ namespace OpenRA.Mods.Common.Traits if (!Ready) return; - var power = Instances.FirstOrDefault(i => !i.IsTraitPaused); + var power = Instances.Find(i => !i.IsTraitPaused); if (power == null) return; diff --git a/OpenRA.Mods.Common/Traits/World/EditorActorLayer.cs b/OpenRA.Mods.Common/Traits/World/EditorActorLayer.cs index e1acae47be..ff83a0c110 100644 --- a/OpenRA.Mods.Common/Traits/World/EditorActorLayer.cs +++ b/OpenRA.Mods.Common/Traits/World/EditorActorLayer.cs @@ -332,7 +332,7 @@ namespace OpenRA.Mods.Common.Traits public EditorActorPreview this[string id] { - get { return previews.FirstOrDefault(p => p.ID.Equals(id, StringComparison.OrdinalIgnoreCase)); } + get { return previews.Find(p => p.ID.Equals(id, StringComparison.OrdinalIgnoreCase)); } } } } diff --git a/OpenRA.Mods.Common/UpdateRules/Rules/20230225/ExplicitSequenceFilenames.cs b/OpenRA.Mods.Common/UpdateRules/Rules/20230225/ExplicitSequenceFilenames.cs index d3bca49118..a33a0def50 100644 --- a/OpenRA.Mods.Common/UpdateRules/Rules/20230225/ExplicitSequenceFilenames.cs +++ b/OpenRA.Mods.Common/UpdateRules/Rules/20230225/ExplicitSequenceFilenames.cs @@ -37,7 +37,7 @@ namespace OpenRA.Mods.Common.UpdateRules.Rules { // Keep a resolved copy of the sequences so we can account for values imported through inheritance or Defaults. // This will be modified during processing, so take a deep copy to avoid side-effects on other update rules. - this.resolvedImagesNodes = MiniYaml.FromString(resolvedImagesNodes.WriteToString()).Select(n => new MiniYamlNodeBuilder(n)).ToList(); + this.resolvedImagesNodes = MiniYaml.FromString(resolvedImagesNodes.WriteToString()).ConvertAll(n => new MiniYamlNodeBuilder(n)); var requiredMetadata = new HashSet(); foreach (var imageNode in resolvedImagesNodes) @@ -213,7 +213,7 @@ namespace OpenRA.Mods.Common.UpdateRules.Rules { resolvedDefaultsNode.Value.Nodes.Select(n => n.Build()).ToArray(), resolvedSequenceNode.Value.Nodes.Select(n => n.Build()).ToArray() - }).Select(n => new MiniYamlNodeBuilder(n)).ToList(); + }).ConvertAll(n => new MiniYamlNodeBuilder(n)); resolvedSequenceNode.Value.Value ??= resolvedDefaultsNode.Value.Value; } } diff --git a/OpenRA.Mods.Common/UpdateRules/Rules/20231010/AbstractDocking.cs b/OpenRA.Mods.Common/UpdateRules/Rules/20231010/AbstractDocking.cs index 601011f938..d105535094 100644 --- a/OpenRA.Mods.Common/UpdateRules/Rules/20231010/AbstractDocking.cs +++ b/OpenRA.Mods.Common/UpdateRules/Rules/20231010/AbstractDocking.cs @@ -45,7 +45,7 @@ namespace OpenRA.Mods.Common.UpdateRules.Rules harvesters[actorNode.Key] = harvesterNode.ChildrenMatching("DeliveryBuildings", includeRemovals: false) .FirstOrDefault()?.NodeValue>() ?? new HashSet(); - if (actorNode.ChildrenMatching("Refinery", includeRemovals: false).FirstOrDefault() != null) + if (actorNode.ChildrenMatching("Refinery", includeRemovals: false).Any()) refineries.Add(actorNode.Key.ToLowerInvariant()); } @@ -102,7 +102,7 @@ namespace OpenRA.Mods.Common.UpdateRules.Rules refineryNode.RemoveNode(dockOffsetNode); } - var buildingNode = actorNode.Value.Nodes.FirstOrDefault(n => buildings.Any(b => n.KeyMatches(b, includeRemovals: false))); + var buildingNode = actorNode.Value.Nodes.Find(n => buildings.Any(b => n.KeyMatches(b, includeRemovals: false))); if (buildingNode != null) { var dimensions = buildingNode.ChildrenMatching("Dimensions", includeRemovals: false).FirstOrDefault()?.NodeValue() ?? new CVec(1, 1); diff --git a/OpenRA.Mods.Common/UpdateRules/UpdatePath.cs b/OpenRA.Mods.Common/UpdateRules/UpdatePath.cs index f667d8a5a7..0a7283ded3 100644 --- a/OpenRA.Mods.Common/UpdateRules/UpdatePath.cs +++ b/OpenRA.Mods.Common/UpdateRules/UpdatePath.cs @@ -9,6 +9,7 @@ */ #endregion +using System; using System.Collections.Generic; using System.Linq; using OpenRA.Mods.Common.UpdateRules.Rules; @@ -98,7 +99,7 @@ namespace OpenRA.Mods.Common.UpdateRules if (namedType != null && namedType.IsSubclassOf(typeof(UpdateRule))) return new[] { (UpdateRule)objectCreator.CreateBasic(namedType) }; - return Paths.FirstOrDefault(p => p.source == source)?.Rules(chain); + return Array.Find(Paths, p => p.source == source)?.Rules(chain); } public static IEnumerable KnownPaths { get { return Paths.Select(p => p.source); } } diff --git a/OpenRA.Mods.Common/UpdateRules/UpdateUtils.cs b/OpenRA.Mods.Common/UpdateRules/UpdateUtils.cs index 3592e7d153..26b7eb5f2a 100644 --- a/OpenRA.Mods.Common/UpdateRules/UpdateUtils.cs +++ b/OpenRA.Mods.Common/UpdateRules/UpdateUtils.cs @@ -35,7 +35,7 @@ namespace OpenRA.Mods.Common.UpdateRules continue; } - yaml.Add(((IReadWritePackage)package, name, MiniYaml.FromStream(package.GetStream(name), name, false).Select(n => new MiniYamlNodeBuilder(n)).ToList())); + yaml.Add(((IReadWritePackage)package, name, MiniYaml.FromStream(package.GetStream(name), name, false).ConvertAll(n => new MiniYamlNodeBuilder(n)))); } return yaml; @@ -68,7 +68,7 @@ namespace OpenRA.Mods.Common.UpdateRules { // Ignore any files that aren't in the map bundle if (!filename.Contains('|') && mapPackage.Contains(filename)) - fileSet.Add((mapPackage, filename, MiniYaml.FromStream(mapPackage.GetStream(filename), filename, false).Select(n => new MiniYamlNodeBuilder(n)).ToList())); + fileSet.Add((mapPackage, filename, MiniYaml.FromStream(mapPackage.GetStream(filename), filename, false).ConvertAll(n => new MiniYamlNodeBuilder(n)))); else if (modData.ModFiles.Exists(filename)) externalFilenames.Add(filename); } @@ -177,9 +177,9 @@ namespace OpenRA.Mods.Common.UpdateRules } if (mapNode != null && mapNode.Nodes.Count > 0) - yaml.Add(mapNode.Nodes.Select(n => n.Build()).ToList()); + yaml.Add(mapNode.Nodes.ConvertAll(n => n.Build())); - return MiniYaml.Merge(yaml).Select(n => new MiniYamlNodeBuilder(n)).ToList(); + return MiniYaml.Merge(yaml).ConvertAll(n => new MiniYamlNodeBuilder(n)); } static IEnumerable FilterExternalModFiles(ModData modData, IEnumerable files, HashSet externalFilenames) @@ -241,7 +241,7 @@ namespace OpenRA.Mods.Common.UpdateRules if (rule is IBeforeUpdateActors beforeActors) { var resolvedActors = MiniYaml.Load(modData.DefaultFileSystem, modData.Manifest.Rules, null) - .Select(n => new MiniYamlNodeBuilder(n)).ToList(); + .ConvertAll(n => new MiniYamlNodeBuilder(n)); manualSteps.AddRange(beforeActors.BeforeUpdateActors(modData, resolvedActors)); } @@ -250,7 +250,7 @@ namespace OpenRA.Mods.Common.UpdateRules if (rule is IBeforeUpdateWeapons beforeWeapons) { var resolvedWeapons = MiniYaml.Load(modData.DefaultFileSystem, modData.Manifest.Weapons, null) - .Select(n => new MiniYamlNodeBuilder(n)).ToList(); + .ConvertAll(n => new MiniYamlNodeBuilder(n)); manualSteps.AddRange(beforeWeapons.BeforeUpdateWeapons(modData, resolvedWeapons)); } @@ -259,7 +259,7 @@ namespace OpenRA.Mods.Common.UpdateRules if (rule is IBeforeUpdateSequences beforeSequences) { var resolvedImages = MiniYaml.Load(modData.DefaultFileSystem, modData.Manifest.Sequences, null) - .Select(n => new MiniYamlNodeBuilder(n)).ToList(); + .ConvertAll(n => new MiniYamlNodeBuilder(n)); manualSteps.AddRange(beforeSequences.BeforeUpdateSequences(modData, resolvedImages)); } diff --git a/OpenRA.Mods.Common/UtilityCommands/Utilities.cs b/OpenRA.Mods.Common/UtilityCommands/Utilities.cs index f9d42341f8..95f36d1ebc 100644 --- a/OpenRA.Mods.Common/UtilityCommands/Utilities.cs +++ b/OpenRA.Mods.Common/UtilityCommands/Utilities.cs @@ -11,7 +11,6 @@ using System; using System.IO; -using System.Linq; using OpenRA.FileSystem; namespace OpenRA.Mods.Common.UtilityCommands @@ -47,7 +46,7 @@ namespace OpenRA.Mods.Common.UtilityCommands var fs = map ?? modData.DefaultFileSystem; var topLevelNodes = MiniYaml.Load(fs, manifestNodes, mapProperty); - return topLevelNodes.FirstOrDefault(n => n.Key == key); + return topLevelNodes.Find(n => n.Key == key); } } } diff --git a/OpenRA.Mods.Common/Warheads/SpreadDamageWarhead.cs b/OpenRA.Mods.Common/Warheads/SpreadDamageWarhead.cs index 88ce7d7107..d635ef4a4b 100644 --- a/OpenRA.Mods.Common/Warheads/SpreadDamageWarhead.cs +++ b/OpenRA.Mods.Common/Warheads/SpreadDamageWarhead.cs @@ -91,7 +91,7 @@ namespace OpenRA.Mods.Common.Warheads falloffDistance = closestDistance; break; case DamageCalculationType.ClosestTargetablePosition: - falloffDistance = victim.GetTargetablePositions().Select(x => (x - pos).Length).Min(); + falloffDistance = victim.GetTargetablePositions().Min(x => (x - pos).Length); break; case DamageCalculationType.CenterPosition: falloffDistance = (victim.CenterPosition - pos).Length; diff --git a/OpenRA.Mods.Common/Widgets/Logic/Editor/SaveMapLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Editor/SaveMapLogic.cs index 768b3cb983..e0be9dc4e0 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Editor/SaveMapLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Editor/SaveMapLogic.cs @@ -146,8 +146,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic if (map.Package != null) { - 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))); + 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))); } // Prioritize MapClassification.User directories over system directories diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ClassicProductionLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ClassicProductionLogic.cs index b09ce9ded8..64ce412f79 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ClassicProductionLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ClassicProductionLogic.cs @@ -33,7 +33,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic void SelectTab(bool reverse) { - palette.CurrentQueue = queues.FirstOrDefault(q => q.Enabled); + palette.CurrentQueue = Array.Find(queues, 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(); diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/GameInfoStatsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/GameInfoStatsLogic.cs index 8131d86b87..17519f3ac3 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/GameInfoStatsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/GameInfoStatsLogic.cs @@ -212,7 +212,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic } var localClient = orderManager.LocalClient; - var localPlayer = localClient == null ? null : world.Players.FirstOrDefault(player => player.ClientIndex == localClient.Index); + var localPlayer = localClient == null ? null : Array.Find(world.Players, player => player.ClientIndex == localClient.Index); bool LocalPlayerCanKick() => localClient != null && (Game.IsHost || ((!orderManager.LocalClient.IsObserver) && localPlayer.WinState == WinState.Undefined)); bool CanClientBeKicked(Session.Client client, Func isVoteKick) => diff --git a/OpenRA.Mods.Common/Widgets/Logic/Installation/ModContentPromptLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Installation/ModContentPromptLogic.cs index 9fcdbebcca..41cc86066b 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Installation/ModContentPromptLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Installation/ModContentPromptLogic.cs @@ -80,7 +80,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic var downloadYaml = MiniYaml.Load(modFileSystem, content.Downloads, null); modFileSystem.UnmountAll(); - var download = downloadYaml.FirstOrDefault(n => n.Key == content.QuickDownload); + var download = downloadYaml.Find(n => n.Key == content.QuickDownload); if (download == null) throw new InvalidOperationException($"Mod QuickDownload `{content.QuickDownload}` definition not found."); diff --git a/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyLogic.cs index ace279b627..b3582d65ac 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyLogic.cs @@ -274,7 +274,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic var botTypes = map.PlayerActorInfo.TraitInfos().Select(t => t.Type); var options = new Dictionary>(); - var botController = orderManager.LobbyInfo.Clients.FirstOrDefault(c => c.IsAdmin); + var botController = orderManager.LobbyInfo.Clients.Find(c => c.IsAdmin); if (orderManager.LobbyInfo.Slots.Values.Any(s => s.AllowBots)) { var botOptions = new List() diff --git a/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyUtils.cs b/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyUtils.cs index a9e0da0f9b..05ce5ada7f 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyUtils.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyUtils.cs @@ -74,7 +74,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic { foreach (var b in map.PlayerActorInfo.TraitInfos()) { - var botController = orderManager.LobbyInfo.Clients.FirstOrDefault(c => c.IsAdmin); + var botController = orderManager.LobbyInfo.Clients.Find(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.FirstOrDefault(cc => cc.SpawnPoint == selectedSpawn) == orderManager.LocalClient) + if (Game.IsHost || orderManager.LobbyInfo.Clients.Find(cc => cc.SpawnPoint == selectedSpawn) == orderManager.LocalClient) orderManager.IssueOrder(Order.Command($"clear_spawn {selectedSpawn}")); } diff --git a/OpenRA.Mods.Common/Widgets/Logic/MapChooserLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/MapChooserLogic.cs index 2b68c50ab7..42bc19ef22 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/MapChooserLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/MapChooserLogic.cs @@ -356,7 +356,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic gameModeDropdown.GetText = () => { - var item = categories.FirstOrDefault(m => m.Category == category); + var item = categories.Find(m => m.Category == category); if (item == default((string, int))) item.Category = TranslationProvider.GetString(NoMatches); diff --git a/OpenRA.Mods.Common/Widgets/Logic/ReplayBrowserLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/ReplayBrowserLogic.cs index b6926cbdf3..3923e4542f 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/ReplayBrowserLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/ReplayBrowserLogic.cs @@ -696,7 +696,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic void SelectFirstVisibleReplay() { - SelectReplay(replays.FirstOrDefault(r => replayState[r].Visible)); + SelectReplay(replays.Find(r => replayState[r].Visible)); } void SelectReplay(ReplayMetadata replay) diff --git a/OpenRA.Mods.Common/Widgets/Logic/Settings/AudioSettingsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Settings/AudioSettingsLogic.cs index 560a4f11c6..fddafe4ace 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Settings/AudioSettingsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Settings/AudioSettingsLogic.cs @@ -103,7 +103,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic videoVolumeSlider.OnChange += x => Game.Sound.VideoVolume = x; var devices = Game.Sound.AvailableDevices(); - soundDevice = devices.FirstOrDefault(d => d.Device == ss.Device) ?? devices.First(); + soundDevice = Array.Find(devices, d => d.Device == ss.Device) ?? devices.First(); var audioDeviceDropdown = panel.Get("AUDIO_DEVICE"); audioDeviceDropdown.OnMouseDown = _ => ShowAudioDeviceDropdown(audioDeviceDropdown, devices, scrollPanel); diff --git a/OpenRA.Mods.Common/Widgets/ResourcePreviewWidget.cs b/OpenRA.Mods.Common/Widgets/ResourcePreviewWidget.cs index 5a36e78c06..1f34d7f8f2 100644 --- a/OpenRA.Mods.Common/Widgets/ResourcePreviewWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ResourcePreviewWidget.cs @@ -38,7 +38,7 @@ namespace OpenRA.Mods.Common.Widgets { resourceType = value; if (resourceType != null) - resourceRenderer = resourceRenderers.FirstOrDefault(r => r.ResourceTypes.Contains(resourceType)); + resourceRenderer = Array.Find(resourceRenderers, r => r.ResourceTypes.Contains(resourceType)); else resourceRenderer = null; } diff --git a/OpenRA.Mods.Common/Widgets/ScrollPanelWidget.cs b/OpenRA.Mods.Common/Widgets/ScrollPanelWidget.cs index 6ffc5dc972..74e0eb4a4a 100644 --- a/OpenRA.Mods.Common/Widgets/ScrollPanelWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ScrollPanelWidget.cs @@ -10,7 +10,6 @@ #endregion using System; -using System.Linq; using OpenRA.Graphics; using OpenRA.Primitives; using OpenRA.Widgets; @@ -284,7 +283,7 @@ namespace OpenRA.Mods.Common.Widgets public void ScrollToItem(string itemKey, bool smooth = false) { - var item = Children.FirstOrDefault(c => c is ScrollItemWidget si && si.ItemKey == itemKey); + var item = Children.Find(c => c is ScrollItemWidget si && si.ItemKey == itemKey); if (item != null) ScrollToItem(item, smooth); @@ -292,7 +291,7 @@ namespace OpenRA.Mods.Common.Widgets public void ScrollToSelectedItem() { - var item = Children.FirstOrDefault(c => c is ScrollItemWidget si && si.IsSelected()); + var item = Children.Find(c => c is ScrollItemWidget si && si.IsSelected()); if (item != null) ScrollToItem(item); @@ -469,7 +468,7 @@ namespace OpenRA.Mods.Common.Widgets if (collection != col) return; - var widget = Children.FirstOrDefault(w => widgetItemEquals(w, item)); + var widget = Children.Find(w => widgetItemEquals(w, item)); if (widget != null) RemoveChild(widget); });