Skip to content

docs(adr): ADR-0024 - Prefer explicit foreach over LINQ #232

@joshsmithxrm

Description

@joshsmithxrm

Status

Proposed

Context

Code scanning tools (CodeQL, Copilot) frequently suggest converting foreach loops with if conditions to LINQ .Where() chains. This creates PR review noise and doesn't improve correctness.

Decision

Prefer explicit foreach loops over LINQ .Where()/.Select() chains for filtering.

Rationale

  • Readability: Explicit loops are clearer, especially for complex filtering logic
  • Debuggability: Easier to step through and inspect variables
  • Maintainability: Easier to add logging, error handling, or additional logic
  • Team preference: Confirmed by codebase owner

Exceptions

LINQ is acceptable for:

  • Simple one-liners: items.Where(x => x.IsActive).ToList()
  • Projection: items.Select(x => x.Name).ToList()
  • Method chains: When LINQ reads more naturally (OrderBy, GroupBy, etc.)

Consequences

Examples

// Preferred
foreach (var item in items)
{
    if (item.IsActive)
    {
        ProcessItem(item);
    }
}

// Avoid (unless simple one-liner)
foreach (var item in items.Where(x => x.IsActive))
{
    ProcessItem(item);
}

Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    Status

    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions