BidirectionalDictionary 1.4.0
dotnet add package BidirectionalDictionary --version 1.4.0
NuGet\Install-Package BidirectionalDictionary -Version 1.4.0
<PackageReference Include="BidirectionalDictionary" Version="1.4.0" />
<PackageVersion Include="BidirectionalDictionary" Version="1.4.0" />
<PackageReference Include="BidirectionalDictionary" />
paket add BidirectionalDictionary --version 1.4.0
#r "nuget: BidirectionalDictionary, 1.4.0"
#:package BidirectionalDictionary@1.4.0
#addin nuget:?package=BidirectionalDictionary&version=1.4.0
#tool nuget:?package=BidirectionalDictionary&version=1.4.0
BidirectionalDictionary
Proper implementation of a bidirectional dictionary, also known as "BiMap" or "two-way dictionary", for .NET Standard 2.0 and higher.
Quick sample
using System.Collections.Generic;
var countryCapitals = new BidirectionalDictionary<string, string>()
{
["Italy"] = "Rome",
["India"] = "New Delhi",
["USA"] = "Washington, D.C.",
};
Console.WriteLine(countryCapitals["Italy"]); // "Rome"
Console.WriteLine(countryCapitals.Inverse["Rome"]); // "Italy"
Read-only support
You can expose a read-only view over an existing bidirectional dictionary, keeping inversion capabilities intact. The wrapper uses the same underlying data and blocks modifications through the read-only API.
From BidirectionalDictionary:
using System.Collections.Generic;
BidirectionalDictionary<Key, Value> bidirectionalDictionary = ...;
var readOnly = bidirectionalDictionary.AsReadOnly();
From IBidirectionalDictionary:
using System.Collections.Generic;
using System.Collections.ObjectModel;
IBidirectionalDictionary<Key, Value> bidirectionalDictionary = ...;
var readOnly = new ReadOnlyBidirectionalDictionary<Key, Value>(dictionary);
Interfaces
To support abstraction-friendly code, the package exposes two interfaces:
IBidirectionalDictionaryIReadOnlyBidirectionalDictionary
Both BidirectionalDictionary and ReadOnlyBidirectionalDictionary implement these interfaces,
so you can depend on contracts instead of concrete types when needed.
LINQ extensions
The package includes LINQ-extensions to create a BidirectionalDictionary directly from sequences.
From KeyValuePair<TKey, TValue>:
using System.Linq;
IEnumerable<KeyValuePair<int, string>> source = new[]
{
new KeyValuePair<int, string>(1, "one"),
new KeyValuePair<int, string>(2, "two")
};
var bidirectionalDictionary = source.ToBidirectionalDictionary();
From tuple sequence:
using System.Linq;
IEnumerable<(string Key, string Value)> source = new[]
{
(Key: "US", Value: "United States"),
(Key: "IT", Value: "Italy")
};
var bidirectionalDictionary = source.ToBidirectionalDictionary();
From arbitrary source with selectors:
using System.Linq;
var users = new[]
{
new { Id = 10, Email = "a@example.com" },
new { Id = 20, Email = "b@example.com" }
};
var bidirectionalDictionary = users.ToBidirectionalDictionary(user => user.Id, user => user.Email);
You can also pass custom comparers via overloads with keyComparer and valueComparer.
License
The library is licensed under the MIT license.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- No dependencies.
-
.NETStandard 2.1
- No dependencies.
-
net6.0
- No dependencies.
NuGet packages (1)
Showing the top 1 NuGet packages that depend on BidirectionalDictionary:
| Package | Downloads |
|---|---|
|
Scover.Dialogs
A Windows TaskDialog wrapper that also supports navigation and hyperlinks. |
GitHub repositories (1)
Showing the top 1 popular GitHub repositories that depend on BidirectionalDictionary:
| Repository | Stars |
|---|---|
|
dotnet/XAMLStudio
XAML Studio is a rapid prototyping tool for WinUI-based XAML that can then be easily copied into Visual Studio!
|