Tools.Collections.ConcurrentDictionary.RemoveIf
2.1.0
dotnet add package Tools.Collections.ConcurrentDictionary.RemoveIf --version 2.1.0
NuGet\Install-Package Tools.Collections.ConcurrentDictionary.RemoveIf -Version 2.1.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Tools.Collections.ConcurrentDictionary.RemoveIf" Version="2.1.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Tools.Collections.ConcurrentDictionary.RemoveIf --version 2.1.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: Tools.Collections.ConcurrentDictionary.RemoveIf, 2.1.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Tools.Collections.ConcurrentDictionary.RemoveIf as a Cake Addin #addin nuget:?package=Tools.Collections.ConcurrentDictionary.RemoveIf&version=2.1.0 // Install Tools.Collections.ConcurrentDictionary.RemoveIf as a Cake Tool #tool nuget:?package=Tools.Collections.ConcurrentDictionary.RemoveIf&version=2.1.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
Tools.Collections.ConcurrentDictionary.RemoveIf
Description
Extensions method for System.Collections.Concurrent.ConcurrentDictionary
Namespace: Tools.Collections.Concurrent.Extensions
Use: ConcurrentDictionary<TKey, IValueWrapper<TValue>>
Description of the mechanism of work: https://stackoverflow.com/questions/39679779/how-to-achieve-remove-if-functionality-in-net-concurrentdictionary
Usage example:
using System.Collections.Concurrent;
using Tools.Collections.ConcurrentDictionary.RemoveIf.Model;
using Tools.Collections.ConcurrentDictionary.RemoveIf.Model.Containers.ClassContainers;
public record LinkItem<T>
{
#region
public int LinkCount { init; get; }
public T Value { init; get; }
public bool HaveValue { init; get; }
#endregion
#region
public static LinkItem<T> CreateZeroLink()
{
return new LinkItem<T>()
{
LinkCount = 0,
HaveValue = false
};
}
public static RealItemWrapper<LinkItem<T>> CreateZeroLinkWrapper()
{
return new RealItemWrapper<LinkItem<T>>(
CreateZeroLink()
);
}
public static LinkItem<T> CreateOneLink(T value)
{
return new LinkItem<T>()
{
Value = value,
LinkCount = 1,
HaveValue = true
};
}
public static RealItemWrapper<LinkItem<T>> CreateOneLinkWrapper(T value)
{
return new RealItemWrapper<LinkItem<T>>(
CreateOneLink(value)
);
}
public LinkItem<T> IncrementCounter(T value)
{
return new LinkItem<T>()
{
LinkCount = LinkCount + 1,
Value = value,
HaveValue = true
};
}
public RealItemWrapper<LinkItem<T>> IncrementCounterWrapper(T value)
{
return new RealItemWrapper<LinkItem<T>>(
IncrementCounter(value)
);
}
public LinkItem<T> DecrementCounter()
{
if (
HaveValue
&& LinkCount > 0
)
{
return new LinkItem<T>()
{
Value = Value,
LinkCount = LinkCount - 1,
HaveValue = true
};
}
else
{
return this;
}
}
public RealItemWrapper<LinkItem<T>> DecrementCounterWrapper()
{
return new RealItemWrapper<LinkItem<T>>(
DecrementCounter()
);
}
#endregion
}
public class LinkCounterClassTest
{
public void Test1()
{
ConcurrentDictionary<
string,
IValueWrapper<LinkItem<string>>
>
dictionary
= new ConcurrentDictionary<
string,
IValueWrapper<LinkItem<string>>
>();
var key = "key";
{
var valueFactory = (string k) => "value";
var updateValueFunc = (string k, string e) => e;
//Add first link to key
AddLink(dictionary, key, valueFactory, updateValueFunc);
//Add second link to key
AddLink(dictionary, key, valueFactory, updateValueFunc);
}
{
//Remove first link to key
RemoveLink(dictionary, key, out var removeResult1);
//Remove second link to key and remove key Item
RemoveLink(dictionary, key, out var removeResult2);
}
}
#region
public static IValueWrapper<LinkItem<TValue>> AddLink<TKey, TValue>(
ConcurrentDictionary<
TKey,
IValueWrapper<LinkItem<TValue>>
>
dictionary,
TKey key,
Func<TKey, TValue> valueFactorFunc,
Func<TKey, TValue, TValue> updateValueFunc
)
where TKey : notnull
{
return dictionary
.AddOrUpdate(
key: key,
addValueFactory: (k) => LinkItem<TValue>.CreateOneLinkWrapper(valueFactorFunc(k)),
updateValueFactory: (k, e) => e.Value.IncrementCounterWrapper(updateValueFunc(k, e.Value.Value))
);
}
public static void RemoveLink<TKey, TValue>(
ConcurrentDictionary<
TKey,
IValueWrapper<LinkItem<TValue>>
>
dictionary,
TKey key,
out RemoveResult<LinkItem<TValue>> result
)
where TKey : notnull
{
var changeCounterResult = dictionary
.AddOrUpdate(
key: key,
addValueFactory: static (k) => LinkItem<TValue>.CreateZeroLinkWrapper(),
updateValueFactory: static (k, e) => e.Value.DecrementCounterWrapper()
);
//Remove item if link count = 0
//if (result.Value.LinkCount != 0)
//{
// return false;
//}
dictionary.RemoveIf(
key: key,
removeIfFunc: static e => e.Value.LinkCount == 0,
out result
);
}
#endregion
}
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. 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. |
.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 was computed. |
.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. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
.NETStandard 2.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.