{"record":{"id":"574552d760583077","repo":"louthy/language-ext","slug":"argumentoutofrangeexception-lst-internal","errorCode":null,"errorMessage":"ArgumentOutOfRangeException","messagePattern":"ArgumentOutOfRangeException","errorType":"exception","errorClass":"ArgumentOutOfRangeException","httpStatus":null,"severity":"error","filePath":"LanguageExt.Core/Immutable Collections/List/Internal/Lst.Internal.cs","lineNumber":346,"sourceCode":"        {\n            state = folder(state, item);\n        }\n        return state;\n    }\n\n    /// <summary>\n    /// Map\n    /// </summary>\n    [Pure]\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public LstInternal<U> Map<U>(Func<A, U> map) =>\n        new (this.AsEnumerable().Select(map));\n\n    [Pure]\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public Iterable<A> FindRange(int index, int count)\n    {\n        if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException(nameof(index));\n        if (count < 0) throw new ArgumentOutOfRangeException(nameof(index));\n        return Iterable.createRange(Go());\n\n        IEnumerable<A> Go()\n        {\n            var iter = new ListEnumerator<A>(Root, false, index, count);\n            while (iter.MoveNext())\n            {\n                yield return iter.Current;\n            }\n        }\n    }\n\n    /// <summary>\n    /// Filter\n    /// </summary>\n    [Pure]\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]","sourceCodeStart":328,"sourceCodeEnd":364,"githubUrl":"https://github.com/louthy/language-ext/blob/2f0e3628242889774d4141960a35671a0280051f/LanguageExt.Core/Immutable Collections/List/Internal/Lst.Internal.cs#L328-L364","documentation":"LstInternal.FindRange(index, count) throws ArgumentOutOfRangeException when index < 0 or index >= Count — the slice start must point at an existing element. Unlike RemoveRange this uses ArgumentOutOfRangeException with the parameter name, reflecting its read-only slicing nature.","triggerScenarios":"FindRange(-1, n); FindRange(list.Count, n) (e.g. paging past the end); FindRange on an empty list where Count == 0 so even index 0 is out of range.","commonSituations":"Paging logic where page * pageSize lands exactly on or past Count; slicing an empty result set from a query; start index computed from a larger prior snapshot.","solutions":["Check 0 <= index < list.Count before calling FindRange.","Handle empty lists before slicing (Count == 0 means any index is invalid).","Compute page starts as Math.Min(page*pageSize, Count-1) and skip when the list is empty.","Prefer Skip(index).Take(count)-style APIs if you want empty results instead of exceptions."],"exampleFix":"// before\nvar page = lst.FindRange(pageIndex * pageSize, pageSize);\n// after\nvar start = pageIndex * pageSize;\nvar page = lst.Count == 0 || start >= lst.Count\n    ? Iterable.empty<A>()\n    : lst.FindRange(start, pageSize);","handlingStrategy":"validation","validationCode":"var page = (lst.Count > 0 && start >= 0 && start < lst.Count)\n    ? lst.FindRange(start, count)\n    : Iterable.empty<A>();","typeGuard":"static bool CanFindRange<A>(Lst<A> lst, int index, int count) =>\n    lst.Count > 0 && index >= 0 && index < lst.Count && count >= 0;","tryCatchPattern":"try { var page = lst.FindRange(start, size); }\ncatch (ArgumentOutOfRangeException)\n{\n    var page = Iterable.empty<A>(); // past-the-end page\n}","preventionTips":["Handle the empty-list case (Count == 0) before any FindRange call.","Validate page-start arithmetic (page * pageSize) against Count.","Prefer Skip/Take semantics when out-of-range slices should yield empty results.","Test paging at exact boundaries: last full page and first empty page."],"tags":["csharp","languageext","list","argument-out-of-range"],"backgroundTag":"argument-out-of-range","analyzedSha":"2f0e3628242889774d4141960a35671a0280051f","analyzedAt":"2026-09-15T03:31:55.716Z","contentChangedAt":"2026-09-15T03:31:55.716Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}