DoNetExtensions 0.1.0
dotnet add package DoNetExtensions --version 0.1.0
NuGet\Install-Package DoNetExtensions -Version 0.1.0
<PackageReference Include="DoNetExtensions" Version="0.1.0" />
<PackageVersion Include="DoNetExtensions" Version="0.1.0" />
<PackageReference Include="DoNetExtensions" />
paket add DoNetExtensions --version 0.1.0
#r "nuget: DoNetExtensions, 0.1.0"
#addin nuget:?package=DoNetExtensions&version=0.1.0
#tool nuget:?package=DoNetExtensions&version=0.1.0
Update 9 and 10 adds SubArray Methods, Sort Enhancement, Mutable Pair/Triple (and its support by IList and IDictionary), Dictionary-Based Counting, and ForEach Shortcut. The "In" method now adds support for python-style range checking like "3.In(2,5) // range from 2 to 5", "3.In(2,10,2) // range from 2 to 10 step by 2"
Use command "Install-Package DoNetExtensions" WITHOUT version number at the end to get the latest version.
Please check the project GitHub for full description. This is a trimmed version due to length limit.
Initial Release
1. Consistent Containment Check -- The "In" Method
Instead of "a.Contains(b)", we provide an alternative "b.In(a)". If "a" is a collection, the the method checks if "b" is an element in "a"; if "a" is a dictionary, then the method checks if "b" is a key in "a". This "In" method is somewhat "python" style, shorter and more consistent; besides that, it returns false for null reference.
var arr = new[] {1,2,3};
if (1.In(arr)) // equivalent to arr.Contains(1)
Do something...
var dict = new Dictionary<string, int> { { "a", 1 } };
if ("a".In(dict)) // equivalent to dict.ContainsKey("a")
Do something...
arr = null;
1.In(arr); // returns false
1.NotIn(arr); // returns true
dict = null;
"a".In(dict); // returns false
"a".NotIn(dict); // returns true
We also provide "InAny" and "InAll".
1.InAny(new []{1,2,3}, new[]{2,3,4}); // returns true
1.InAll(new []{1,2,3}, new[]{2,3,4}); // returns false
The same extension is added for string.
'c'.In("string to check"); // returns true
'c'.NotIn("string to check"); // returns false
'c'.InAll("string to check", "another string"); // returns false
'c'.InAny("string to check", "another string"); // returns true
The same extension is added for Python style range checking. The lower bound is included in the range, while the upper bound is excluded.
// ranges (2,5) represents number 2,3,4
1.In(2,5); // returns false
2.In(2,5); // returns true, lower bound is included
5.In(2,5); // returns false, upper bound is excluded
// range (1,5,2) represents number 1,3, the numbers from 1 to 5 with step 2
2 In(1,5,2); // returns false
3.In(1,5,2); // returns true
In: returns true if the element to check is contained in an array/list/collection/string/range, or a key of a dictionary.
NotIn: negation of In.
InAny: returns true if the element to check is contained in any of the provided arrays/lists/collections/strings.
InAll: returns true if the element to check is contained in all of the provided arrays/lists/collections/strings.
2. Collection to Array Conversion
var list = new List<int>();
var arr = list.ToArrayOrNull(); // returns a null reference
list.Add(1);
list.Add(2);
arr = list.ToArrayOrNull(); // returns an array [1,2]
arr = list.ToArrayThenClear(); // returns an array [1,2] and clears the list
arr = list.ToArrayOrNull(); // returns a null reference because list has been cleared.
ToArrayOrNull: returns a null reference if the collection is empty (rather than returns an empty array by the build-in ToArray() method), or otherwise works like build-in ToArray() method.
ToArrayThenClear: works like the build-in ToArray() method, but clears the collection after the elements are output to the array.
ToArrayOrNullThenClear: works like the ToArrayOrNull() method, but clears the collection after the elements are output to the array.
3. Consistent Emptiness Check
Although incredibly useful, the emptiness of an array or a collection has to be checked in a clumsy way, even for today after 10 years.
var arr = new int[] {1,2,3};
if (arr != null && arr.Length != 0) // NOTE: the new syntax "arr?.Length != 0" will not do the check as desired!
Do something...
var list = new List<int> {1,2,3};
if (list != null && arr.Count != 0) // NOTE: have to use a different property "Count"
Do something...
Now with the extension, above can be greatly simplified and more readable. The method is added to both arrays and collections.
var arr = new int[] {1,2,3};
if (arr.IsNotNullOrEmpty())
Do something...
var list = new List<int> { 1,2,3};
if (list.IsNotNullOrEmpty())
Do something...
var dict = new Dictionary<string, int> { { "a", 1 } };
if (dict.IsNotNullOrEmpty())
Do something...
IsNullOrEmpty: Returns true if a collection is a null reference or is an empty collection.
IsNotNullOrEmpty: Returns true if a collection is not a null reference or is not an empty collection.
IsEmpty: Returns true if a collection is an empty collection (throws an NullReferenceException if it is a null reference).
IsNotEmpty: Returns true if a collection is not an empty collection (throws an NullReferenceException if it is a null reference).
4. Convenient IndexOf
Adds extension methods that dummpy the Array.IndexOf and static Array.IndexOf methods. Also adds support for searches of subarrays.
var arr = new [] {1, 2, 3, 4};
arr.IndexOf(2); //returns 1, equivalent to Array.IndexOf(arr, 2)
arr.IndexOf(2, 2); // searches for 2 starting at position 2 of the array, so returns -1
arr.IndexOf(4, 1, 2); // searches for 4 starting at position 1 of the array, and only compares 2 elements afterwards, so returns -1
arr.IndexOf(4, 1, 3); // return 3
arr.IndexOf(new[] {3, 4}); // searches the subarray and returns 2.
5. Collection to Concatenated String
var arr = new int[] {1,2,3};
arr.ToConcatString(','); // returns "1,2,3"
arr.ToConcatString("--"); // returns "1--2--3"
6. Array Updating Operations
It is not uncommon that we might need to just add/remove one specified item to/from an array, and return a new array with the item added/removed (for example, such addition/removal is rarely used by the client, and it is not desirable to complicate the code design with other data structure like list or linked list).
var arr = new int[] {1,2,3};
var arr2 = arr.Remove(2); // returns a new array instance [1,3]
var arr3 = arr.RemoveAt(2); // returns a new array instance [1,2]
var arr4 = arr.AddFirst(0); // returns a new array instance [0,1,2,3]
var arr5 = arr.AddLast(4); // returns a new array instance [1,2,3,4]
var arr6 = arr.Insert(18, index:2); // returns a new array [1,2,18,3], with 18 inserted at position 2
var arr7 = arr.Insert(arr, index:2); // returns a new array [1,2,1,2,3,3], with "1,2,3" inserted at position 2
var merged = (new[] { arr, arr2, arr3, arr4, arr5, arr6, arr7}).Merge(); // merges all above arrays into on single array.
<a name="ValueSwap"></a>7. Value Swap
Swapping two values have been an annoying issue that disrupts code readability. The following extensions address this problem. It is implemented by efficient bit operations when possible.
var a = 1;
var b = 2;
a.Swap(ref b);
Console.WriteLine(a); // prints 2
Console.WriteLine(b); // prints 1
var t1 = DateTime.Now;
var t2 = new DateTime(2010, 10, 22);
t1.Swap(ref t2);
Console.WriteLine(t1); // prints "[10/22/2010 12:00:00 AM]"
Console.WriteLine(t2); // prints the recorded time
Due to complier limitation, currently the extension only supports value types or structs. For reference type, you could consider use Swapper.Swap static method.
var a = "123";
var b = "456";
Swapper.Swap(ref a, ref b); // due to compiler limitation, a static method has to be used for reference types
Swap: Swaps the current value of struct types with another value.
...... Please more on GibHub https://github.com/tonyriverms/DoNetExtensions.
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. 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 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. |
-
.NETStandard 2.0
- Microsoft.CSharp (>= 4.4.1)
- System.Dynamic.Runtime (>= 4.3.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Intial Release Update 10: added mutable Pair/Triple support, Dictionary-Based Counting, and ForEach Shortcut