[API Proposal]: AlternateLookup.TryAdd overload with actualKey output + similar CollectionsMarshal overloads
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 42/100
- Issue type
- Feature
- Clarity
- Mostly clear
- Activity status
- Quiet
- Tech stack
- csharp
- Domain
- api, backend-api-design
Research direction
Start with the proposed Dictionary<TKey,TValue>.AlternateLookup.TryAdd overload and the two CollectionsMarshal signatures. Compare their requested behavior—returning the existing or newly added actual key—and resolve the nullable-annotation question for GetValueRefOrNullRef. Done means an agreed API shape for all three proposals.
Written by the indexing model from the issue text.
Description
Background and motivation
I am finding myself in situations where I need the actual key after a call to TryAdd, which currently requires me to either do an additional subsequent lookup or additional allocation to create it again using the alternate comparer. It would be nice if TryAdd had an overload that output the actual key (existing key if it exists, otherwise the new key it creates).
API Proposal
partial class Dictionary<TKey, TValue>
{
partial struct AlternateLookup<TAlternateKey>
{
public bool TryAdd(TAlternateKey key, TValue value, out TKey actualKey);
}
}
partial class CollectionsMarshal
{
public static ref TValue? GetValueRefOrAddDefault<TKey,TValue,TAlternateKey>(
System.Collections.Generic.Dictionary<TKey,TValue>.AlternateLookup<TAlternateKey> dictionary,
TAlternateKey key,
out TKey actualKey,
out bool exists);
// Not 100% sure about this one, the nullable annotation on the actual key is a bit wonky
// but I don't think there's anything that can be done about that
public static ref TValue GetValueRefOrNullRef<TKey,TValue,TAlternateKey>(
System.Collections.Generic.Dictionary<TKey,TValue>.AlternateLookup<TAlternateKey> dictionary,
TAlternateKey key,
out TKey? actualKey);
}
API Usage
ReadOnlySpan<char> key = ...;
int value = ...;
if (altLookup.TryAdd(key, value, out string actualKey)
{
Console.WriteLine($"Added '{actualKey}'.");
}
else
{
Console.WriteLine($"Key '{actualKey}' already exists.");
}
Alternative Designs
No response
Risks
None
- Dominant language
- C#
- Stars
- 18.3k
- Forks
- 5.6k
- PR merge metrics
- PR metrics pending
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from dotnet/runtime
-
agentic-workflows untriaged
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
-
area-System.Reflection blocking-clean-ci-optional Known Build Error os-mac-os-x untriaged
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
-
area-CodeGen-coreclr untriaged
Difficulty 1/5 Under an hour Newbie friendliness 92/100
-
agentic-workflows untriaged
Difficulty 1/5 Under an hour Newbie friendliness 78/100
-
area-VM-meta-mono untriaged
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
-
:watch: Not Triaged 11.0 fundamentals/subsvc
Difficulty 2/5 1-3 hours Newbie friendliness 92/100
dotnet/AspNetCore.Docs#37699 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
SubtitleEdit/subtitleedit#15108 · 1 comment ·
-
area/docs-content Bug pulumi/docs
Difficulty 1/5 1-3 hours Newbie friendliness 94/100
-
Create parent directories only after the containment check in InstallHelper.TryExtractToDirectory Open
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
PowerShell/PSResourceGet#2056 ·